【GoogleDrive】自動ファイル削除でタイムアウトする場合の対応方法

GoogleDriveのファイルを自動削除するプログラムVer2 電子工作
PR

はじめに

ESP32-CAMを使ったウェブカメラを製作。
撮影した画像は、Googleドライブに保存しています。
【IoT】ESP32-CAMを使ってWEBカメラを自作してみた(使い方編)

そして、保存しているとファイルが溜まる一方なので、定期的に削除するプログラムを作ってみました。
【自動削除】Google Driveに保存したファイルを定期的に削除するプログラム

ただし、ファイル数が多くなると、稀に次のエラーが通知が届くようになりました。
ファイル数が少ない場合は、上記のコードで上手くいきました。

エラーメッセージの考察

コード的には、指定した時間のタイムアウト時に再度トリガーを設定するようにしていました。
このエラーメッセージを読むと、トリガー数が多すぎるというエラーのようです。

Start Function Error Message Trigger End
2023-10-16 01:04:56 Japan Standard Time deleteOldFiles Exception: This script has too many triggers. Triggers must be deleted from the script before more can be added. time-based 2023-10-16 01:08:57 Japan Standard Time

対策コードを書いてみる

タイムアウト時のトリガーの再設定から、ファイルを分割して削除する方法に変更します。
これでトリガー数のエラーは回避できるはず。

function deleteOldFiles() {
var folderName = "abc"; // 対象のフォルダ名
var daysThreshold = 30; // バッファを見て30日

var folder = DriveApp.getFoldersByName(folderName).next();
var files = folder.getFiles();
var now = new Date();

while (files.hasNext()) {
var file = files.next();
var createdDate = file.getDateCreated();
var daysPassed = Math.floor((now - createdDate) / (1000 * 60 * 60 * 24)); // 日数の差分を計算

if (daysPassed >= daysThreshold) {
file.setTrashed(true); // ゴミ箱に送る
}

// 処理時間を監視し、制限時間を超えたら処理を終了する
if (new Date() - now >= 30000) { // 30秒(30000ミリ秒)を制限時間とする
ScriptApp.newTrigger("deleteOldFiles") // トリガーの再設定
.timeBased()
.after(2000) // 2秒後に再実行
.create();
break;
}
}
}
PR

おわりに

2週間ほど運用しましたが、いまのところエラーはありません。

PR

関連記事

追記

最終版?ともいえる安定板を公開します。
タイムアウト対策で1回の処理で100件に制限しています。 その代わりにトリガーを2時間おきに設定してエラー時に次のトリガーでフォローします。

【最終版?】GoogleDriveに保存したファイルの自動削除プログラム

created by Rinker
Moechando
¥1,490 (2024/10/04 05:37:00時点 Amazon調べ-詳細)

コメント

タイトルとURLをコピーしました