Google Apps Script(GAS)の実行可能回数をカウントするためには、GASの制限事項を理解し、それに基づいてスクリプトを設計することが重要です。以下に、GASの主要な制限事項とその対策について詳しく説明します。
GASの主要な制限事項:実行時間制限
- 1回の実行時間: 6分(360秒)
- カスタム関数の実行時間: 30秒
GASの主要な制限事項:トリガーの制限
- 1ユーザーあたりのトリガー数: 20個
- トリガーの合計実行時間: 90分/日
同時実行の制限
- 同時実行数: 30/ユーザー
その他の制限
実行回数をカウントする方法
GASの実行回数をカウントするためには、スクリプト内で実行回数を記録する仕組みを組み込む必要があります。
以下に、実行回数をカウントするための基本的な方法を紹介します。
実行回数をカウントする方法. スクリプトプロパティを使用する
スクリプトプロパティを利用して、実行回数を保存および更新する方法です。
以下のコードは、スクリプトの実行回数をカウントし、一定回数に達したら特定の処理を行う例です。
function countExecutions() {
// スクリプトプロパティを取得
var scriptProperties = PropertiesService.getScriptProperties();
// 実行回数を取得
var count = scriptProperties.getProperty('executionCount');
if (!count) {
count = 0;
}
// 実行回数をインクリメント
count++;
// 実行回数を保存
scriptProperties.setProperty('executionCount', count);
// 実行回数をログに出力
Logger.log('Execution count: ' + count);
// 実行回数が特定の値に達した場合の処理
if (count >= 10) {
Logger.log('Execution count has reached 10.');
// 必要な処理をここに記述
}
}
実行回数をカウントする方法.getRemainingDailyQuota(残りのメール送信回数を取得する)
Gmailのトリガーを実行する際に、あと何回実行できるかを知るためには、GASのクォータを確認し、残りの実行回数を計算する必要があります。
以下に、GASのクォータ情報と残りの実行回数を取得する方法を説明します。
function logRemainingEmailQuota() {
var remainingQuota = MailApp.getRemainingDailyQuota();
Logger.log('Remaining email quota: ' + remainingQuota);
}
MailApp.getRemainingDailyQuota()
メソッドを使用して、残りのメール送信回数を取得できます。このメソッドは、当日の残りのメール送信回数を返します。
実行回数をカウントする方法. トリガーを使用する
トリガーを使用して定期的にスクリプトを実行し、その都度実行回数をカウントする方法です。
以下は、毎日スクリプトを実行して実行回数をカウントする例です。
function createDailyTrigger() {
// 毎日午前1時にスクリプトを実行するトリガーを作成
ScriptApp.newTrigger('countExecutions')
.timeBased()
.atHour(1)
.everyDays(1)
.create();
}
function deleteTriggers() {
// すべてのトリガーを削除
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
制限を超えないための工夫. 実行時間を分割する
長時間かかる処理を複数の短い処理に分割し、それぞれをトリガーで実行する方法です。
例えば、処理を5分ごとに中断し、1分後に再開するように設定します。
function processLargeData() {
var startTime = new Date().getTime();
var scriptProperties = PropertiesService.getScriptProperties();
var lastProcessedIndex = scriptProperties.getProperty('lastProcessedIndex') || 0;
var data = getData(); // 処理するデータを取得する関数
for (var i = lastProcessedIndex; i < data.length; i++) {
// データ処理
processData(data[i]);
// 6分の制限に近づいたら処理を一時停止し、トリガーを設定
if (new Date().getTime() - startTime >= 300000) { // 5分(300,000ミリ秒)
scriptProperties.setProperty('lastProcessedIndex', i);
ScriptApp.newTrigger('processLargeData')
.timeBased()
.after(1 * 60 * 1000) // 1分後に再実行
.create();
return;
}
}
// 全てのデータ処理が完了したら、プロパティをリセット
scriptProperties.deleteProperty('lastProcessedIndex');
}
function getData() {
// ダミーデータを生成
var data = [];
for (var i = 0; i < 1000; i++) {
data.push('Data ' + i);
}
return data;
}
function processData(data) {
// データ処理の内容
Logger.log('Processing: ' + data);
}
制限を超えないための工夫. 効率的なコードを書く
スプレッドシートのデータを一括で取得し、配列で操作することで、実行時間を短縮します。
function updateSpreadsheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
var dataRange = sheet.getDataRange();
var values = dataRange.getValues();
// データを一括で処理
for (var i = 0; i < values.length; i++) {
values[i][1] = 'Updated ' + values[i][0];
}
// データを一括で更新
dataRange.setValues(values);
}
制限を超えないための工夫. エラーハンドリング
実行回数や時間制限に達した場合にエラーハンドリングを行い、適切に処理を中断・再開する仕組みを組み込みます。
function safeProcess() {
try {
processLargeData();
} catch (e) {
Logger.log('Error: ' + e.message);
// 必要に応じてエラーハンドリングの処理を追加
}
}
まとめ
これらの方法を組み合わせることで、GASの制限内で効率的にスクリプトを実行し、実行回数をカウントすることができます。