毎朝、スプレッドシートを開いて、GASの「実行」ボタンを押す。それだけの作業なのに、忙しい日に限って押し忘れてしまう……。
私もGASを書き始めたころは、「関数は動くのに、毎回自分で動かしているだけ」という状態でした。せっかく書いたコードなのに、これでは自動化とは言えませんよね。
この記事では、GASの関数を毎日決まった時間帯に自動で動かす「時間主導型トリガー」の設定手順を、小さな例で一緒にやってみましょう。うまく動かないときの確認場所と、失敗したときに届く通知メールもあわせて整理します。
- 時間主導型トリガーとは何か(結論)
- 毎日動かす小さな関数の作り方
- 画面からトリガーを追加する手順
- コードでトリガーを作る方法と、重複させない注意点
- 実行ログの見方と、失敗したときの通知メール
- よくあるつまずきと直し方
結論:トリガーを1つ作れば、関数は自動で動く
先に結論です。
- GASには、指定した時間に関数を自動実行する時間主導型トリガー(クロックトリガー)があります
- 画面からは、左側の「トリガー」→「トリガーを追加」→「保存」で作れます
- 動かした結果は、左側の「実行」で確認できます
- 実行に失敗すると、Googleから失敗を知らせるメールが届きます
つまり、「動く関数」さえあれば、あとはトリガーを足すだけです。難しいコードは必要ありません。
準備:毎日動かす小さな関数を用意する
まずは、トリガーで動かす関数を用意します。ここでは「実行された日時を、シートに1行ずつ記録する」だけの小さな関数にします。ログが残るので、動いたかどうかがひと目で分かります。
- Googleスプレッドシートを新しく作り、シート名を
logにします - メニューの「拡張機能」→「Apps Script」を開きます
- 次のコードを貼り付けて保存します
- 1
- 2
- 3
- 4
- 5
function dailyJob() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('log');
sheet.appendRow([new Date(), 'dailyJob が実行されました']);
console.log('dailyJob finished');
}getSheetByName('log') は、シート名が違うと null を返します。シート名の打ち間違いは、のちほどの「つまずき」でも出てくるので、ここで合わせておきましょう。
保存したら、エディタ上部の「実行」ボタンで、まず手動で1回動かします。初回は承認を求める画面が出るので、案内に従って許可してください。シートに1行増えていれば準備完了です。
エディタの開き方や実行の基本を復習したい方は、こちらもどうぞ。
時間主導型トリガーを設定する手順(画面から)
関数が動くことを確認できたら、いよいよトリガーを作ります。Google公式の手順は次のとおりです。
- Apps Scriptのプロジェクトを開く
- 左側の「トリガー」(目覚まし時計のアイコン)をクリックする
- 右下の「トリガーを追加」をクリックする
- 作成するトリガーのタイプを選んで設定する
- 「保存」をクリックする
手順4の設定画面では、次の内容を選びます。
| 設定する内容 | この記事の例 |
|---|---|
| 実行する関数 | dailyJob |
| イベントのソース | 時間主導型 |
| 時間ベースのトリガーのタイプ | 日付ベースのタイマー(毎日) |
| 時刻 | 午前9時〜10時 |
画面の細かい項目名は、Googleの更新で変わることがあります。見つからないときは、「関数」「時間主導型」「毎日」「時間帯」の4つを探すつもりで見てみてください。
公式ドキュメントによると、時間主導型トリガーの時間は多少ランダムになります。たとえば午前9時の毎日トリガーを作ると、午前9時から10時までのどこかの時刻が選ばれ、そのタイミングが毎日続きます。「9時ちょうどに動く」と考えると、動かないと勘違いしやすいので注意してください。
最初の承認画面が出た場合は、手動実行のときと同じように許可すれば大丈夫です。
コードでトリガーを作る方法
画面ではなく、コードからトリガーを作ることもできます。次のコードを一度だけ実行すると、毎日午前9時台に dailyJob が動くトリガーができます。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
function createDailyTrigger() {
ScriptApp.newTrigger('dailyJob')
.timeBased()
.atHour(9)
.everyDays(1)
.inTimezone('Asia/Tokyo')
.create();
}atHour() を使うときは、everyDays() のような頻度の指定も一緒に必要です(公式のリファレンスにも書かれています)。inTimezone() を省くと、スクリプトのタイムゾーンで動きます。
createDailyTrigger を2回実行すると、同じトリガーが2つできてしまいます。作る前に、次のコードで今のトリガーを確認しておくと安心です。
- 1
- 2
- 3
- 4
- 5
function listTriggers() {
ScriptApp.getProjectTriggers().forEach(trigger => {
console.log(trigger.getHandlerFunction());
});
}不要なトリガーは、画面の「トリガー」から削除できます。コードで消す場合は、ScriptApp.deleteTrigger(trigger) を使います。
実行ログを見て、動いたか確認する
トリガーを作ったら、動いたかどうかを確認しましょう。
- Apps Scriptの左側で「実行」を開く
- 一覧に
dailyJobが出ていて、エラーなく終わっているか見る - 行を選ぶと、
console.logで出力した内容を確認できる - スプレッドシートの
logシートに、行が増えているか見る
トリガーはパソコンを開いていなくても動きます。朝いちばんに「実行」を見て、夜のうちに動いていたことが分かると、ちょっと安心しますよね。
失敗したときの通知メールを知っておく
時間主導型トリガーは、自分が画面を見ていないときに動きます。そのため、関数がエラーで止まっても、画面にエラーは出ません。
公式ドキュメントによると、失敗した場合は Apps Script から次のようなメールが届きます。
- 送信元:
[email protected] - 件名:
Summary of failures for Apps Script - 内容:スクリプトが最近うまく完了しなかったことを知らせる要約
メールには、トリガーを無効にしたり設定を見直したりするためのリンクがあります。原因を調べるときは、スクリプトを開いて、左側の「実行」でエラーメッセージを確認します。
なお、失敗通知はトリガーとセットで動くものです。トリガーが有効なあいだは、通知の頻度を調整できます。通知を止めたいときは、トリガー自体を削除します。
失敗通知を試したいとき
通知が届くかどうかを確かめたい場合は、わざと失敗する関数を作って、トリガーを付けてみましょう。確認が終わったら、トリガーは削除してください。
- 1
- 2
- 3
function failTest() {
throw new Error('通知メールのテスト用エラーです');
}自分宛てのメールも送りたいとき
Googleからの通知とは別に、失敗した内容を自分で送ることもできます。MailApp.sendEmail() を使う例です。メールアドレスはダミーなので、自分のものに置き換えてください。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
function dailyJobWithMail() {
try {
dailyJob();
} catch (e) {
MailApp.sendEmail('[email protected]', 'dailyJobが失敗しました', e.message);
throw e;
}
}最後の throw e; を残しておくと、実行ログにも失敗として記録されます。このときはトリガーの実行関数を dailyJobWithMail にします。
よくあるつまずき
| 症状 | よくある原因 | 確認すること |
|---|---|---|
| 9時ちょうどに動かない | 時間は多少ランダムになる仕様 | 午前9時〜10時の間に動いていれば正常 |
| トリガーを作ったのに、シートが増えない | 実行に失敗している | 左側の「実行」でエラーメッセージを見る |
Cannot read properties of null のようなエラー | シート名が違い、getSheetByName が null を返している | シート名が log か確認する |
| 同じ処理が2回走る | 同じトリガーを2つ作った | 「トリガー」の一覧で重複を削除する |
実行一覧に dailyJob が出てこない | トリガーの「実行する関数」が別の関数になっている | 「トリガー」の一覧で関数名を確認する |
| 時刻がずれて感じる | タイムゾーンの違い | inTimezone('Asia/Tokyo') を指定するか、スクリプトのタイムゾーンを確認する |
困ったときは、まず「実行」の画面を見て、エラーメッセージを読むところから始めましょう。ほとんどの原因は、そこに書いてあります。
次の一歩
小さな関数で時間主導型トリガーを動かせたら、次は「毎日やっている自分の作業」に置き換えてみましょう。
- 受信箱を毎日きれいにしたい方:GASでGmailを自動整理!ラベル付け&定期実行トリガーで受信箱をスッキリさせる方法
- 請求や支払いの期日を忘れたくない方:GASで請求リマインドを自動化|支払い期日の確認と下書き作成
- GAS全体の学び方を整理したい方:GAS学習の進め方|既存記事をつなぐ学習マップ
まずは今日、dailyJob に時間主導型トリガーを付けて、明日の朝に「実行」の画面を見てみてください。自分の手を離れて動いているのを確認できると、自動化の感覚がぐっとつかめます。
関連する本・記事
本:『Google Apps Script × 生成AI 全自動仕事術』
毎日の転記や集計といった単純作業を、GASで自動化する流れを扱った本です。生成AIに日本語で頼みながら進めたい方に向いています。
記事:
- GAS学習の進め方|既存記事をつなぐ学習マップ:GASの記事を、学ぶ順番にまとめたマップです
- GASでGmailを自動整理!ラベル付け&定期実行トリガーで受信箱をスッキリさせる方法:トリガーを使った実用例です