UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【GAS】スクリプトの処理時間が長すぎてタイムアウトエラーになってしまう

GASで作ったスクリプトの処理時間が長すぎてタイムアウトエラーになってしまうので対応する

GASの無償版のスクリプトの実行時間は6分以内収めないといけないらしい

Google サービスの割り当て  |  Apps Script  |  Google for Developers

今回はある配列をループしている際に一定の件数を超えるとタイムアウトになってしまうため、実行時間内に収まる配列と、収まらない残り分の配列に分割することを考えた

フローは以下

  1. 収まらない残り分の配列の値は、シートを新規作成し、そこに逃しておく
  2. 別の拡張機能を用意し、それを実行することで、1.で作ったシートから値を取ってきて配列を作り、残りの処理を続けるようにする
  3. 実行し終わったらシートを消す

新しいシートを作成をGASでやるにはどうしたら良いかを調べたところ以下と分かった

const tmpSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
tmpSheet.setName("tmp");

このシートに値を逃しておく

  restList.forEach(function(item, index) {
    tmpSheet.getRange('A' + index).setValue(item)
  })

これでうまくいくと思ったが予期せぬ問題が発生した

問題

実行可能な分の配列を実行中に「新規フォルダを作る」という処理があり、そのフォルダに配列の値をファイル名としたファイルを作っていく処理がある

仮にそれを「Aフォルダ」という名前だとすると、実行可能な分の配列で作成した後に、残りの分の配列を実行した結果「Aフォルダ (1)」という別フォルダができてしまった

残りの配列も先に作った「Aフォルダ」にファイルを作成していきたい

これを解決するため、まずは新規で作成したフォルダIDを取得する

const drive = DriveApp.getFolderById(DRIVE_ID);
const folder = drive.createFolder("Aフォルダ");
const folderId = folder.getId();

このフォルダIDも「tmp」シートに値として逃しておく

そして、残りの配列の実行時にこのフォルダIDからフォルダインスタンスを取得する

const folder = DriveApp.getFolderById(folderId);

これで問題は解決した