【GAS×生成AI】非エンジニアが開発してみた(その2)自動で毎朝今日のタスクをメールで通知

  • このエントリーをはてなブックマークに追加
【GAS×生成AI】非エンジニアが開発してみた(その2)自動で毎朝今日のタスクをメールで通知

定型作業は、一度の作業時間が短くても、毎日続けば負担になります。

こうした繰り返し作業の自動化に活用できるのが、Google Apps Script(GAS)です。

GASを使えば、Googleスプレッドシートの情報を取得したり、メールを送信したりする処理を自動化できます。しかし、プログラミングの知識がない方にとっては、「自分でコードを書くのは難しそう」と感じるかもしれません。

そこで今回は、非エンジニアが生成AIのGeminiに相談しながら、GASを使ったメールの自動送信に挑戦してみます。

まずは簡単なメール送信を試し、その後「スプレッドシートに登録した当日のタスクを、毎朝メールで通知する」という仕組みを作ります。

【GAS×生成AI】メールの自動送信にも活用できる?

GASは、Googleスプレッドシートの操作だけでなく、Googleが提供するさまざまなサービスと連携できます。

たとえば、GASを使って以下のような処理を自動化できます。

  • 指定した日時にメールを送信する
  • スプレッドシートの内容をメールで通知する
  • Googleカレンダーの予定を取得して通知する
  • Googleフォームの回答をメールで通知する

また、Slackなどのチャットツールへ通知する仕組みを作ることもできます。

今回はできるだけシンプルな仕組みにするため、スプレッドシートに記載したタスクをGASで取得し、メールで通知する方法を試してみます。

関連記事

【GAS×生成AI】まずはメールの自動送信を試してみる

いきなり複雑な仕組みを作るのではなく、まずはGASからメールを送信できるか確認します。

生成AI(Gemini)にGASでメールを送る方法を相談

GASでメールを送りたいです。
今日の18時に、次の内容を送る手順を教えてください。コードも作成してください。

▼送信先のメールアドレス
xxxx@example.com

▼件名
テストメール

▼本文
〇〇様

おつかれさまです。
これはテストメールです。

生成AI(Gemini)が提案した手順とGASのコード

手順

スクリプトを作成してコードを貼り付ける
Google Apps Scriptで新規プロジェクトを作成し、もともと記載されているコードを削除します。そこに生成AIから提案されたコードを貼り付けて保存します。

メール送信の予約を設定する
次に、翌朝8時にメールを送信するための予約を設定します。
1. エディタ上部の関数選択から setTomorrow8AMTrigger を選択します。
2. 「実行」をクリックします。
3. 初回実行時に承認画面が表示されたら、Googleアカウントを選択し、必要な権限を許可します。
4. 実行ログに「明日の朝8時にメール送信トリガーを設定しました。」と表示されれば、予約完了です。

設定したトリガーは、画面左側の時計アイコン(トリガー)から確認できます。不要になった場合は、該当するトリガーのゴミ箱アイコンから削除できます。

コード

// メール送信関数
function sendEmail() {
  const recipient = "xxxx@example.com"; // 送信先メールアドレス
  const subject = "テストメール";        // 件名
  const body = "〇〇様";               // 本文

  // メール送信
  GmailApp.sendEmail(recipient, subject, body);
}

// 明日の朝8時に送信するためのトリガーを設定する関数
function setTomorrow8AMTrigger() {
  // 既存の同名トリガーを削除(二重送信防止)
  const triggers = ScriptApp.getProjectTriggers();
  for (let i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === 'sendEmail') {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

  // 明日の日付を計算
  const tomorrow = new Date();
  tomorrow.setDate(tomorrow.getDate() + 1);
  tomorrow.setHours(8, 0, 0, 0); // 朝8時00分00秒に設定

  // 特定の日時に実行するトリガーを作成
  ScriptApp.newTrigger('sendEmail')
    .timeBased()
    .at(tomorrow)
    .create();
  
  Logger.log("明日の朝8時(" + tomorrow.toLocaleString() + ")にメール送信トリガーを設定しました。");
}

スクリプトを作成してコードを貼り付ける

関数選択から setTomorrow8AMTrigger を選択

設定したトリガー

実際にメールを送信してみた結果

実行してみると、設定したとおりにメールが届きました。

まずは成功です。

GASから届いたメール

GASのコードを一から作ることはできなくても、生成AIに「やりたいこと」を伝えることで、メール送信の仕組みを作ることができました。

次は、もう少し実用的な仕組みに挑戦します。

【GAS×生成AI】スプレッドシートのタスクを毎朝メールで通知する

次に作るのは、スプレッドシートに登録した当日のタスクを、毎朝メールで自動通知する仕組みです。

今回は、以下の流れで処理します。

スプレッドシート → GAS → 当日のタスクを抽出 → メール送信

今回作る「タスク自動通知」の仕組み

スプレッドシートには、日付とタスクを登録しておきます。

GASが当日の日付を確認し、スプレッドシートから当日のタスクだけを取得します。

そして、取得したタスクをメール本文にまとめて、指定したメールアドレスへ送信します。

さらにGASのトリガーを設定すれば、毎朝決まった時間帯に自動で処理を実行できます。

スプレッドシートに日付とタスクを登録

生成AI(Gemini)に実装方法を相談

GASで毎朝その日の予定をメールを送りたいです。

▼月曜~金曜日の朝9時にその日の予定を送信する

▼送信先は次の3か所
aaaa01@example.com
bbbb02@example.com
cccc03@example.com

▼スプレッドシートに予定を記載
A列:年月日(2026年9月1日)
B列:曜日(火)
C列:時間(10:00)
D列:予定(△△社電話連絡)

▼メールの件名
本日(〇〇〇〇年〇〇月〇日)の予定

▼メール本文
おはようございます。
本日〇〇〇〇年〇〇月〇日の予定です。

年月日 曜日 時間 予定
年月日 曜日 時間 予定
年月日 曜日 時間 予定

生成AI(Gemini)が提案した手順とGASのコード

手順

GASコードを設定する
まず、スプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、生成AIから提案されたGASコードを貼り付けて保存します。

定期実行(トリガー)を設定する
次に、毎朝自動でメールを送信するため、GASのトリガーを設定します。

1.Apps Scriptの左メニューにある時計アイコン(トリガー)をクリックします。
2. 右下の「トリガーを追加」をクリックします。
3. 「実行する関数を選択」で、メール送信用の関数(sendDailySchedule)を選択します。
4. 「イベントの源を選択」で「時間駆動型」を選択します。
5. 「時間型トリガーのタイプを選択」で「日付ベースのタイマー」を選択します。
6. 「時刻を選択」で「午前8時~9時」など、メールを送信したい時間帯を指定します。
7. 「保存」をクリックします。

初回設定時にアクセス権限の承認画面が表示された場合は、画面の案内に従って許可します。
なお、スプレッドシートの「年月日」は、文字列ではなく日付データとして入力しておく必要があります。また、土日にメールを送信しない場合は、コード側で曜日を判定するなどの設定が必要です。

実行は押さなくてもいいのか?

実行を押す手順がありません。押さなくてもいいのでしょうか?

こちらもgeminiにきいてみたところ、トリガーを設定していれば、「実行」ボタンを押さなくても良いとのことでした。

トリガー設定後は自動でメールが送信される

トリガーを設定していれば、「実行」ボタンを押さなくても、設定した時間に自動でメールが送信されます。PCを閉じていても実行されます。

「実行」ボタンは動作確認のための手動実行、「トリガー」は指定したスケジュールで自動実行する仕組みです。

コード

function sendDailySchedule() {
  // スプレッドシートとシートの取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues(); // 全データを取得
  
  // 今日の日付を取得(時刻を00:00:00にリセット)
  const today = new Date();
  today.setHours(0, 0, 0, 0);
  
  // 今日の予定を格納する配列
  const todaySchedules = [];
  
  // 1行目はヘッダーと仮定し、2行目からループ処理(i = 1)
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const dateVal = row[0]; // A列:年月日
    
    if (dateVal instanceof Date) {
      const scheduleDate = new Date(dateVal);
      scheduleDate.setHours(0, 0, 0, 0);
      
      // 日付が今日と一致するか判定
      if (scheduleDate.getTime() === today.getTime()) {
        const dayOfWeek = row[1]; // B列:曜日
        
        // C列(時間)のフォーマット整形
        let timeStr = row[2];
        if (timeStr instanceof Date) {
          timeStr = Utilities.formatDate(timeStr, Session.getScriptTimeZone(), "HH:mm");
        }
        
        const event = row[3]; // D列:予定
        
        // A列の日付表示フォーマット(例: 2026年9月1日)
        const formattedDate = Utilities.formatDate(scheduleDate, Session.getScriptTimeZone(), "yyyy年M月d日");
        
        todaySchedules.push(`${formattedDate} ${dayOfWeek} ${timeStr} ${event}`);
      }
    }
  }
  
  // 本日の予定がない場合は送信せずに終了(送信したい場合はこのブロックを調整してください)
  if (todaySchedules.length === 0) {
    Logger.log("本日の予定はありません。");
    return;
  }
  
  // メール件名・本文の作成
  const todayFormatted = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy年M月d日");
  const subject = `本日(${todayFormatted})の予定`;
  
  const body = `おはようございます。
本日${todayFormatted}の予定です。

${todaySchedules.join("\n")}`;

  // 送信先リスト
  const recipients = [
    "aaaa01@example.com",
    "bbbb02@example.com",
    "cccc03@example.com"
  ].join(",");

  // メール送信
  GmailApp.sendEmail(recipients, subject, body);
}

コードを貼り付け

トリガーを設定

実際に試してみるとメールが届かない?

コードを設定して実行してみました。

ところが、メールが届きません。

GASの「実行数」を確認すると、「本日の予定はありません。」という結果になっています。

しかし、スプレッドシートを確認すると、本日の予定は2件登録されています。

どうやら、スプレッドシートから当日のタスクを正しく取得できていないようです。

GASの「実行数」を確認

メールが届かない原因を生成AI(Gemini)に相談

そこで、実行結果やコードなどをGeminiに伝え、原因を相談してみます。

「本日の予定はありません。」となり、メールが届きませんでした。原因は何でしょうか?予定は2件記載がありました。

生成AI(Gemini)が提案した原因と解決策

Geminiからは、日付の扱い方やタイムゾーンなどが原因として考えられるという回答がありました。

GASでは、スプレッドシートの日付とGASで取得した日付の形式が異なることで、同じ日付でも「一致しない」と判断される場合があるとのことです。

「本日の予定はありません。」と表示された場合、スプレッドシートの「日付」と今日の日付を、GASが正しく一致させられていない可能性があります。

主な原因として、以下の3つが考えられます。

原因1:A列の日付が文字列になっている

見た目が「2026年9月9日」でも、文字列として入力されていると、GASが日付として認識できない場合があります。A列の日付セルを確認し、必要に応じて 2026/9/9 などと入力し直したうえで、「表示形式」→「数字」→「日付」に設定します。

原因2:タイムゾーンが正しく設定されていない

GASのタイムゾーンが日本時間になっていないと、「今日」の判定がずれる可能性があります。Apps Scriptの「プロジェクトの設定」を開き、タイムゾーンが「Asia/Tokyo」になっているか確認します。

原因3:文字列として日付を比較している

コードが日付を文字列として比較している場合、全角・半角や表記形式の違いによって一致しないことがあります。

改訂版コード

function sendDailySchedule() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  
  // 今日の日付を取得(日本時間)
  const timeZone = Session.getScriptTimeZone();
  const todayStr = Utilities.formatDate(new Date(), timeZone, "yyyy/MM/dd");
  
  const todaySchedules = [];
  
  // 2行目からループ処理
  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    let dateVal = row[0]; // A列:年月日
    
    if (!dateVal) continue; // 空行はスキップ
    
    // 日付を「yyyy/MM/dd」形式の文字列に統一
    let rowDateStr = "";
    if (dateVal instanceof Date) {
      rowDateStr = Utilities.formatDate(dateVal, timeZone, "yyyy/MM/dd");
    } else {
      // 文字列で入力されている場合の表記揺れ吸収(「2026年9月9日」→「2026/09/09」に変換)
      const parsedDate = new Date(String(dateVal).replace(/年|月/g, "/").replace(/日/g, ""));
      if (!isNaN(parsedDate.getTime())) {
        rowDateStr = Utilities.formatDate(parsedDate, timeZone, "yyyy/MM/dd");
      }
    }
    
    // 今日の日付と一致するか判定
    if (rowDateStr === todayStr) {
      const dayOfWeek = row[1]; // B列:曜日
      
      // C列(時間)のフォーマット整形
      let timeStr = row[2];
      if (timeStr instanceof Date) {
        timeStr = Utilities.formatDate(timeStr, timeZone, "HH:mm");
      }
      
      const event = row[3]; // D列:予定
      
      // 表示用の日付文字列作成(2026年9月9日)
      const formattedDate = Utilities.formatDate(new Date(), timeZone, "yyyy年M月d日");
      
      todaySchedules.push(`${formattedDate} ${dayOfWeek} ${timeStr} ${event}`);
    }
  }
  
  // 本日の予定がない場合
  if (todaySchedules.length === 0) {
    Logger.log("本日の予定はありません。");
    return;
  }
  
  // メール件名・本文の作成
  const todayFormatted = Utilities.formatDate(new Date(), timeZone, "yyyy年M月d日");
  const subject = `本日(${todayFormatted})の予定`;
  
  const body = `おはようございます。
本日${todayFormatted}の予定です。

${todaySchedules.join("\n")}`;

  // 送信先リスト
  const recipients = [
    "aaaa01@example.com",
    "bbbb02@example.com",
    "cccc03@example.com"
  ].join(",");

  // メール送信
  GmailApp.sendEmail(recipients, subject, body);
  Logger.log("メールを送信しました。");
}

GASを修正して再度実行してみる

念のため、スプレッドシートの日付の表示形式やGASのタイムゾーンも確認しましたが、特に問題はなさそうです。

スプレッドシートの日付の「表示形式」を確認

GASのタイムゾーンを確認

原因がはっきりしない部分もありますが、Geminiから提案された修正版のコードに変更して、もう一度実行してみます。

今度は成功!タスク通知メールが届いた

修正したGASを実行すると、今度はちゃんとメールが届きました!

メール本文には、スプレッドシートに登録していた当日のタスクが記載されています。

無事に、今回作りたかった「スプレッドシートのタスクを毎朝メールで通知する仕組み」を動かすことができました。

GASから届いたメール

結局、メールが届かなかった原因は?

再度Geminiに、改訂版コードでは正常に動作したことなど、今回の状況を伝えて原因を確認してみました。

Geminiによると、今回の原因として考えられるのは、「日付」のデータ型や扱い方の違いとのことでした。スプレッドシート上では同じ日付に見えていても、GAS側で取得したデータとの間で形式が異なると、正しく一致しない場合があるようです。

表示形式やタイムゾーンを確認しても問題がなかったにもかかわらず、改訂版コードで正常に動作したことから、原因はスプレッドシートからGASへデータが渡される際の日付の扱い方にあったと考えられます。

主な原因は、以下の2つです。

原因1:日付が文字列として渡されていた
スプレッドシート上では「日付」として表示されていても、GASでは文字列として取得される場合があります。

元のコードでは、データが日付型かどうかを確認していたため、文字列として渡されたデータが「日付ではない」と判断され、処理されていなかった可能性があります。

改訂版では、文字列として取得された場合も日付に変換して判定できるように修正しました。

原因2:日付に時刻情報が含まれていた
見た目は同じ「2026/09/09」でも、内部的には時刻情報が含まれている場合があります。
そこで改訂版では、日付を「年月日」の文字列に統一してから比較することで、時刻の違いによる判定ミスを防ぐようにしました。

このように、画面上では同じ日付に見えていても、GASが受け取るデータの形式や時刻情報によって、正しく判定できない場合があります。

今回の改訂版コードでは、こうしたデータ形式の違いを考慮して処理することで、無事に当日のタスクを取得し、メールを送信できるようになりました。

今回のように、生成AIが作成したコードでも、一度で思いどおりに動くとは限りません。

しかし、エラーや実行結果を生成AIに伝えて原因を相談しながら修正できる点は、非エンジニアがGASを使ううえで大きなメリットといえるでしょう。

まとめ:【GAS×生成AI】なら非エンジニアでもメールを自動化できる

今回は、生成AIのGeminiに相談しながら、GASを使ったメールの自動送信に挑戦しました。

まずは簡単なメール送信を試し、その後、スプレッドシートに登録した当日のタスクを毎朝メールで通知する仕組みを作りました。

途中でタスクを正しく取得できないという問題も発生しましたが、生成AIに原因や解決策を相談することで、最終的には想定どおりに動作させることができました。

GASと生成AIを組み合わせれば、プログラミングの専門知識がない方でも、業務の自動化に挑戦できます。

もちろん、生成AIが作成したコードをそのまま使えば必ず動くわけではなく、実際の環境に合わせた修正や動作確認は必要です。

それでも、「コードが分からないから自動化できない」と諦める必要はありません。

まずは、毎日・毎週繰り返している定型業務の中から、自動化できそうな作業を探してみてはいかがでしょうか。

⇒社内のITサポートのことならプロにお任せ!セキュリティ対策やAI活用も「ITボランチ」

⇒IT人材にお困りならボンズテックにご相談ください!適切な人材をご紹介します

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。