ある日、ある会社からInDesign2022のデータが大量にきました。画像抽出の作業なので、IDMLに変換して、作業者(古いInDesignしか持っていない)に渡す。InDesignからIDMLファイルへの変換コード自体はシンプルだが、目標フォルダー内の全て.inddファイルを探すには、再帰処理(関数が自分自身を読んで実行する)が必要です。

app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
var folderObj = Folder.selectDialog("inddファイルの格納フォルダーを選択してください");
if (!folderObj) {
	exit();
}
const allInddFiles = getFiles(folderObj);
const L = allInddFiles.length;
//
for (var i = 0; i < L; i++) {
	$.writeln(i + "/" + L);//簡易進捗
	//
	var oldPath = allInddFiles[i].fullName;
	var newPath = oldPath.replace(/.indd$/g, ".idml");//inddファイルを同じ場所に保存
	var doc = app.open(allInddFiles[i], false);

	doc.exportFile(ExportFormat.INDESIGN_MARKUP, new File(newPath));
	doc.close(SaveOptions.NO);

}
//
alert("作業完了しました。");
//
function getFiles(folderObj) {
	var results = [];
	loop(folderObj);

	function loop(folderObj) {
		var myList = folderObj.getFiles("*.indd"); /////////拡張子
		if (myList.length !== 0) {
			results.push(myList);
		}
		var fileList = folderObj.getFiles();
		var L = fileList.length;
		while (L--) {
			if (fileList[L].constructor.name === "Folder") loop(new Folder(fileList[L].fullName));
		}
	}
	return [].concat.apply([], results);
}