JavaScript連想配列(Dictionary)のキーを並べ替え

皇都祇園祭礼四條河原之涼 コンピュータ
出典:国立国会図書館「NDLイメージバンク」 (https://rnavi.ndl.go.jp/imagebank/)

「GASで複数の画像をOCR処理してテキストファイルに保存するスクリプト」を作成しました。

そのスクリプトを使っていて気が付いたのですが、処理される画像ファイルの順番が順不同です。

getFiles()メソッド取得したファイルイテレーターが順不同であることが原因です。

並べ替えをする方法を探してみましたが、シンプルに連想配列のキーをファイル名、値にOCR処理結果のテキストを格納し、キーを並べ替えしテキストを連結することにしました。

// 結果文字列
let result = '';

// 連想配列を空で初期化
let dic = {};

// 連想配列に要素を追加

dic['file02.png'] = "OCR文書2";
dic['file03.png'] = "OCR文書3";
dic['file01.png'] = "OCR文書1";

// キーの並べ替え
var key = Object.keys(dic);
key.sort();

// 並べ替えキー順に文字列の連結
for( var i = 0; i < key.length; i++ ) {
    result = result + dic[ key[i] ];
}
試したところ、ファイル名順に文字列が連結されることが確認出来ました。
GASのOCRのスクリプトに組み込んでみます。
function myFolderOCR() {
  const ocrFolderID = 'OCRする画像ファイルが保存されたフォルダID';

  // 画像ファイルの一覧を取得
  let files = DriveApp.getFolderById(ocrFolderID).getFiles();
 
  // OCRの設定
  let option = {
    'ocr': true,
    'ocrLanguage': 'ja',
  }

  // 結果のテキストを格納する変数
  let result = '';

  // 結果を格納する連想配列
  let dic = {};

  // 画像ファイル処理ループ
  while(files.hasNext()){
    let file = files.next();

    subject = file.getName(); // 件名
    let resource = { title: subject };
    
    let image = Drive.Files.copy(resource, file.getId(), option);
    let doc = DocumentApp.openById(image.id);
    let text = doc.getBody().getText();

    // ドキュメントファイルの削除
    Drive.Files.remove(doc.getId());
    // result = result + text
    dic[subject] = text;
  }
  // 件名順に並べ替え
  var key = Object.keys(dic);
  key.sort();
  // result = "";
  for( var i = 0; i < key.length; i++ ) {
    result = result + dic[ key[i] ];
  }

  // 結果を保存
  const textFolderID = 'テキストファイルを出力するフォルダID';

  // フォルダーオブジェクトの取得
  let folder = DriveApp.getFolderById(textFolderID);

  // 日時からファイル名を生成
  let date = new Date();
  let fileName = "ocr_" + Utilities.formatDate( date, 'Asia/Tokyo', 'yyyyMMddhhmmss') + ".txt";

  // テキストファイルに保存
  let contentType = 'text/plain'; // MIME
  let charSet = 'UTF8'; // 文字コード
  let blob = Utilities.newBlob("", contentType, fileName).setDataFromString(result, charSet);
  folder.createFile(blob);
  
  console.log(fileName);
}  

コメント