MENU

GASでDrive一覧の取得を途中から再開する

当ページのリンクには広告(PR)が含まれていることがあります。
GASでDrive一覧の取得を途中から再開する。Driveの一覧、継続トークン、途中から再開の処理例。

大量のファイルを読む処理が途中で終わり、毎回先頭から取得しているなら、FileIteratorの継続トークンを使う方法があります。取得を中断した位置を文字列で受け取り、次の実行で残りの項目へ進めます。

ただし、継続トークンはファイル一覧のバックアップではありません。権限や対象ファイルが変わる場合もあり、期限もあります。正式な処理済み記録とは分け、まずはファイルIDを小分けに読む例で動きを確認します。

目次

トークンと対象フォルダを組にする

公式のFileIteratorは、getContinuationTokenで後から再開するためのトークンを取得できると説明しています。一般に1週間有効とされていますが、長期間保存していつでも使える情報だとは考えないでください。

再開にはDriveApp.continueFileIteratorを使います。トークンと別のフォルダIDを組み合わせないよう、保存する状態にも元のフォルダIDを残します。

練習ではファイル3件を置いた専用フォルダを使い、1回に2件ずつ読み取ります。サブフォルダの再帰取得や、ファイルの移動・削除は含めません。

小さな状態を返す読み取り関数

完了済みの状態なら、先頭から取り直さず空の結果を返します。トークンの期限切れで再開に失敗した場合も、自動で最初へ戻す処理は入れていません。

function readFileBatch(drive, folderId, state, limit) {
  if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100) {
    throw new Error('1回の件数は1〜100で指定してください');
  }
  if (state && (state.folderId !== folderId || typeof state.done !== 'boolean' ||
      (state.done ? state.token !== null :
        (typeof state.token !== 'string' || state.token === '')))) {
    throw new Error('再開状態とフォルダを確認してください');
  }
  if (state && state.done) return {files: [], nextState: state};
  const token = state && state.token;
  const iterator = token ? drive.continueFileIterator(token)
    : drive.getFolderById(folderId).getFiles();
  const files = [];
  while (files.length < limit && iterator.hasNext()) {
    files.push(iterator.next().getId());
  }
  const more = iterator.hasNext();
  return {files: files, nextState: {
    folderId: folderId, done: !more,
    token: more ? iterator.getContinuationToken() : null
  }};
}

function previewDriveBatch() {
  const SAVE_CURSOR = false;
  const store = PropertiesService.getUserProperties();
  const raw = store.getProperty('practice.driveCursor.v1');
  const state = raw === null ? null : JSON.parse(raw);
  const result = readFileBatch(DriveApp, '練習用フォルダID', state, 2);
  console.log(JSON.stringify(result.files));
  if (SAVE_CURSOR) store.setProperty('practice.driveCursor.v1', JSON.stringify(result.nextState));
}

既定のSAVE_CURSOR:falseでは再開状態を書き換えません。続きへ進む練習をするときだけtrueへ変えます。架空のIDがF1・F2・F3なら、最初はF1・F2、次はF3、完了後は空の配列になる想定です。実際の取得順がファイル名順になるという意味ではありません。

結果の確認前に位置を保存しない

この例は一覧を読むだけですが、後続へ移動や通知を加える場合は注意が必要です。ファイルを処理する前に位置を保存すると、その後に失敗した項目を飛ばしてしまいます。処理と確認が済んだ後に、次の状態を保存する順番にします。

逆に、外部処理が終わった後に状態保存だけ失敗すると、再実行で同じ項目を処理する可能性があります。ファイルIDごとの結果や、送信先で確認できる結果IDを別に残し、トークンだけで二重処理を防いだつもりにならないようにします。

期限切れと完了後の扱い

再開できない場合は、元のフォルダと直前の記録を確認します。新しい一覧を取り直すなら、既に処理済みのIDとの照合が必要です。期限切れだからと、結果の分からない外部操作をまとめて再実行しません。

完了した後に新しいファイルを追加しても、保存したdoneの状態は自動では変わりません。定期的に一覧を作り直す運用では、実行回を分けた保存キーや開始条件を用意します。同じ状態を永久に使い回さないことが大切です。

ローカルの代用Iteratorで2件ずつの再開、完了後、フォルダ違い、不正状態、件数不備を確認しました。Googleのトークンの保持期間や取得集合の変化は未実行です。設定保存はPropertiesService、元の資料の扱いはDrive整理も参照してください。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次