Webで見つけた手順をそのまま試したつもりだが躓いたため解決方法をメモ
やりたかったこと
Gmailの特定のカテゴリ内のメールのうち、受信日時から一定期間経過したものを自動的に削除したい。
試したこと
下記のサイトを参考にGoogle App Scriptでプロジェクトを作成し実行。
https://tech.torico-corp.com/blog/delete-old-gmails-via-google-apps-script/
NG.gs
function deleteOldGmailsPromoSocial() {
// 下記のメールを削除する
// ・プロモーションカテゴリまたはソーシャルカテゴリ
// ・100日以上前
// ・スター付を除く
var queries = [
'category:promotions',
'category:social'
];
for(var i=0; i < queries.length; i++){
var query = queries[i];
Logger.log('削除開始:' + query);
var criteria = '' + query + ' older_than:100d -is:starred'
var deleteThreads = GmailApp.search(criteria);
Logger.log('該当スレッド: ' + deleteThreads.length + '件');
for (var j = 0; j < 100; j++) {
deleteThreads[j].moveToTrash();
}
Logger.log('' + query + 'の処理を終了')
}
}
結果
Exception: Gmail operation not allowed.
at deleteOldGmailsPromoSocial(コード:19:24)
解決策
以下のようにGmailApp.searchで一度に処理する数を限定することでエラーが発生しづらくなった(数を指定しない場合は上限500件)。
OK.gs
function deleteOldGmailsPromoSocial() {
// 下記のメールを削除する
// ・プロモーションカテゴリまたはソーシャルカテゴリ
// ・100日以上前
// ・スター付を除く
var queries = [
'category:promotions',
'category:social'
];
for(var i=0; i < queries.length; i++){
var query = queries[i];
Logger.log('削除開始:' + query);
var criteria = '' + query + ' older_than:100d -is:starred'
var deleteThreads = GmailApp.search(criteria, 0, 100);
Logger.log('該当スレッド: ' + deleteThreads.length + '件');
for (var j = 0; j < 100; j++) {
deleteThreads[j].moveToTrash();
}
Logger.log('' + query + 'の処理を終了')
}
}
- var deleteThreads = GmailApp.search(criteria);
+ var deleteThreads = GmailApp.search(criteria, 0, 100);
残課題
- 文言から権限の問題に見受けられる「Gmail operation not allowed.」の発生頻度が処理数を増減させることで変わる原因が不明
- 処理数を減らせば減らすほど「Gmail operation not allowed.」の発生頻度が下がるが0にはならないため根本的な解決とはなっていない
予想
一定の処理時間が許可されていない?処理数を減らすことで処理時間が短くなるため「Gmail operation not allowed.」の発生頻度は下がるが、処理対象の容量が大きい時に処理時間が延びることによって発生を0にはできないのではないか?