GASを毎日自動で動かす|時間主導型トリガーの設定手順

毎朝、スプレッドシートを開いて、GASの「実行」ボタンを押す。それだけの作業なのに、忙しい日に限って押し忘れてしまう……。

私もGASを書き始めたころは、「関数は動くのに、毎回自分で動かしているだけ」という状態でした。せっかく書いたコードなのに、これでは自動化とは言えませんよね。

この記事では、GASの関数を毎日決まった時間帯に自動で動かす「時間主導型トリガー」の設定手順を、小さな例で一緒にやってみましょう。うまく動かないときの確認場所と、失敗したときに届く通知メールもあわせて整理します。

💡
この記事でわかること
  • 時間主導型トリガーとは何か(結論)
  • 毎日動かす小さな関数の作り方
  • 画面からトリガーを追加する手順
  • コードでトリガーを作る方法と、重複させない注意点
  • 実行ログの見方と、失敗したときの通知メール
  • よくあるつまずきと直し方

結論:トリガーを1つ作れば、関数は自動で動く

先に結論です。

  • GASには、指定した時間に関数を自動実行する時間主導型トリガー(クロックトリガー)があります
  • 画面からは、左側の「トリガー」→「トリガーを追加」→「保存」で作れます
  • 動かした結果は、左側の「実行」で確認できます
  • 実行に失敗すると、Googleから失敗を知らせるメールが届きます

つまり、「動く関数」さえあれば、あとはトリガーを足すだけです。難しいコードは必要ありません。

時間主導型トリガーの流れ:トリガーを設定すると毎日決まった時間帯に関数が自動で動き、結果は「実行」画面で確認、失敗時は通知メールが届く図

準備:毎日動かす小さな関数を用意する

まずは、トリガーで動かす関数を用意します。ここでは「実行された日時を、シートに1行ずつ記録する」だけの小さな関数にします。ログが残るので、動いたかどうかがひと目で分かります。

  1. Googleスプレッドシートを新しく作り、シート名を log にします
  2. メニューの「拡張機能」→「Apps Script」を開きます
  3. 次のコードを貼り付けて保存します

  • 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公式の手順は次のとおりです。

  1. Apps Scriptのプロジェクトを開く
  2. 左側の「トリガー」(目覚まし時計のアイコン)をクリックする
  3. 右下の「トリガーを追加」をクリックする
  4. 作成するトリガーのタイプを選んで設定する
  5. 「保存」をクリックする

手順4の設定画面では、次の内容を選びます。

設定する内容 この記事の例
実行する関数 dailyJob
イベントのソース 時間主導型
時間ベースのトリガーのタイプ 日付ベースのタイマー(毎日)
時刻 午前9時〜10時

画面の細かい項目名は、Googleの更新で変わることがあります。見つからないときは、「関数」「時間主導型」「毎日」「時間帯」の4つを探すつもりで見てみてください。

⏰
「9時ちょうど」には動きません

公式ドキュメントによると、時間主導型トリガーの時間は多少ランダムになります。たとえば午前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) を使います。


実行ログを見て、動いたか確認する

トリガーを作ったら、動いたかどうかを確認しましょう。

  1. Apps Scriptの左側で「実行」を開く
  2. 一覧に dailyJob が出ていて、エラーなく終わっているか見る
  3. 行を選ぶと、console.log で出力した内容を確認できる
  4. スプレッドシートの 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') を指定するか、スクリプトのタイムゾーンを確認する

困ったときは、まず「実行」の画面を見て、エラーメッセージを読むところから始めましょう。ほとんどの原因は、そこに書いてあります。


次の一歩

小さな関数で時間主導型トリガーを動かせたら、次は「毎日やっている自分の作業」に置き換えてみましょう。

まずは今日、dailyJob に時間主導型トリガーを付けて、明日の朝に「実行」の画面を見てみてください。自分の手を離れて動いているのを確認できると、自動化の感覚がぐっとつかめます。


関連する本・記事

本:『Google Apps Script × 生成AI 全自動仕事術』

毎日の転記や集計といった単純作業を、GASで自動化する流れを扱った本です。生成AIに日本語で頼みながら進めたい方に向いています。

記事:

note:『また、この作業か…』と呟く夜に。生成AIに日本語で頼む、GASの本を読んだ