「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);
}
コメント