2022年2月20日日曜日

Googleドライブのフォルダに保存している画像をOCRしてドキュメントを生成する

画像をOCRして、画像とOCR結果が貼り込まれたドキュメントを生成するスクリプトです。

function main() {
  // マイドライブ\'GoogleAppsScript\dev\test-data\変換元データ
  var srcFolder = getFolder( null, ['GoogleAppsScript','dev','test-data','変換前データ'], false );
  var dstFolder = getFolder( null, ['GoogleAppsScript','dev','test-data','変換後データ'], false );


  let option = {
    "ocr": true,// OCRを行うかの設定です
    "ocrLanguage": "ja",// OCRを行う言語の設定です
  }
  var files = srcFolder.getFiles();
  while( files.hasNext() )
  {
    var file = files.next();
    var resource = {
      title: file.getName()
    };
    let doc = DriveApp.getFileById( Drive.Files.copy(resource, file.getId(), option).id);
    doc.moveTo( dstFolder );
  }

}

/**
 *  指定されたフォルダ取得する、フォルダがないときは新規に作成する。
 *
 *  @param {Folder} parent 基準フォルダ、null指定時はルートフォルダ
 *  @param {string|Array of strings} name 取得・生成するフォルダ名
 *      string 指定時はnameを取得。生成する
 *      Array of strings 指定時は多階層フォルダを一括作成
 *  @param {bool} noCreate 作成は行わず既存のフォルダを取得するときにtrue
 *      省略可能、省略時はfalseとして動作
 *  @return {Folder|undefined} 取得・生成したフォルダ
*/
function getFolder( parent, name, noCreate ) {
  // 親フォルダが指定されなかった場合はルートフォルダを取得する。
  if ( parent == null ){
    var folder = DriveApp.getRootFolder();
  }else{
    var folder = parent;
  }
  // フォルダ名に配列が指定されていない場合は配列にする。
  if( !Array.isArray( name ) ){
    name = [name];
  }
  // noCreateが指定されていない場合はfalseにする。
  if ( noCreate !== true ){
    noCreate = false;
  }

  while( name.length > 0 ){
    var newFolder = name.shift();
    var childs = folder.getFoldersByName( newFolder );
    if( childs.hasNext() ){
      // フォルダが見つかった場合は最初のフォルダを採用
      folder = childs.next();
    } else {
      if( noCreate ){
        // noCreateの場合はnullを返す
        return undefined;
      }else{
        // フォルダが見つからなかった場合はフォルダを作成
        folder = folder.createFolder( newFolder );
      }
    }
  }
  return folder;
}

5 件のコメント:

  1. ありがとうございました。手間が省けました!また困ったらご相談させてください!

    返信削除
    返信
    1. 処理が終わったデータは削除するとか別フォルダに移動する様にして、時間駆動トリガーで定期的に実行すればフォルダに画像を置いてしばらくしたらOCRされてるなんてこともできますね。

      削除
  2. あんまりデータが多いとタイムアウトしてしまいますね。それは防げないですよね^-^;;

    返信削除
    返信
    1. スクリプトが1回に実行できる時間は6分です。
      時間駆動のトリガでスクリプトを実行するのが良いと思います。
      時間トリガで実行しても問題ない様に処理済みのファイルを別フォルダに移動するようにしています。

      削除
  3. このコメントは投稿者によって削除されました。

    返信削除

質問、要望、指摘など書いていただいてもよいですが、対応できるとは限りませんのでご了承ください。私に対するものも含め他の人を嫌な気分になるようなコメントは避けてください。