大量のファイルを読む処理が途中で終わり、毎回先頭から取得しているなら、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整理も参照してください。
