Google Workspaceで挑戦!GoogleフォームとGASで作る「自分専用ToDo通知Bot」開発記

本記事は 春のスキルアップ応援フェア2026 4/23付の記事です

皆さんこんにちは!

気づいたらToDoの数がとんでもなく増えていきがち。 どうも、いとさんです。

実は、人間は「完了したこと」よりも「やり残していること」の方を強く覚えてしまうゼイガルニク効果という性質があるそうです。

リストが増えれば増えるほど、脳が勝手に「あれもやってない、これもやってない」と通知を出し続けている状態なんですね。バックグラウンドで常にタスクが動いているようなもので、これでは脳が休まる暇もありません。

参考・引用: 「中途半端に終わっているものほどよく覚えている『ゼイガルニク効果』とは」 引用:リクナビNEXTジャーナル

この「脳内のバックグラウンドプロセス」を終了させてスッキリさせるためには、まずは情報を頭の外に追い出すことが不可欠です。

さて今回は、
「飲みの場で決まった予定」や「やるべきこと」を、スマホからサッと入力して自分に通知したい。そんな願いを、GoogleフォームとGoogle Apps Script(GAS)だけで叶える個人開発に挑戦しました。

🛠 実装ステップ:自分専用ToDo通知Botの作り方

今回の開発は、大きく分けて3つのフェーズで進めます。

  1. 入力インターフェース(Googleフォーム)の作成
  2. プログラム(GAS)の実装
  3. 自動実行(トリガー)と権限の承認

ステップ1:入力インターフェース(Googleフォーム)の作成

まずはToDoを入力するための窓口を作ります。

  1. Googleフォームを新規作成します。

  2. 以下の2つの質問を用意します。

    • タイトル: ToDoの内容 (記述式)

    • タイトル: 期限 (日付)

  3. 「回答」タブを開き、「スプレッドシートに表示」をクリックして、回答保存用のシートを新規作成します。

ステップ2:プログラム(GAS)の実装

次に、データをメールに変換して飛ばす機能を実装します。

  1. スプレッドシートを新規作成します。
  2. スプレッドシートのメニューから 「拡張機能」「Apps Script」 を開きます。

  3. 表示されたエディタ(コード.gs)の中身を一度空にして、以下のコードを貼り付けます。

/**
 * フォーム送信時に実行されるメイン関数
 */
function onFormSubmit(e) {
  // 1. フォームの入力内容を受け取る
  // 質問タイトルと一文字も違わないように注意!
  const item = e.namedValues['ToDoの内容'] ? e.namedValues['ToDoの内容'][0] : "項目なし";
  
  // 2. 期限のデータを取得し、文字化けを防ぐ処理
  let deadline = "期限なし";
  if (e.namedValues['期限'] && e.namedValues['期限'][0]) {
    try {
      // 日付を「yyyy/MM/dd」の形式に整形
      const dateObj = new Date(e.namedValues['期限'][0]);
      deadline = Utilities.formatDate(dateObj, "JST", "yyyy/MM/dd");
    } catch (err) {
      // 変換失敗時はそのままの文字を使用
      deadline = String(e.namedValues['期限'][0]);
    }
  }

  // 3. 送信先(自分のGmail)を設定
  // ※ ここを自分のアドレスに書き換え
  const recipient = 'your-email@gmail.com'; 
  
  // 4. メールの内容を組み立てる
  const subject = "✅【ToDo通知】" + item;
  const body = `
━━━━━━━━━━━━━━━━━━
✅ 内容: ${item}
✅ 期限: ${deadline}
━━━━━━━━━━━━━━━━━━
※このメールはGoogle Apps Scriptから自動送信されています。
  `;

  // 5. GmailAppを使って送信
  try {
    GmailApp.sendEmail(recipient, subject, body);
    console.log("送信成功!");
  } catch(error) {
    console.error("送信に失敗しました: " + error.toString());
  }
}

ステップ3:自動実行(トリガー)と権限の承認

ここが一番の難所でした。

  1. GASエディタ左側の 「時計アイコン(トリガー)」 をクリックします。

  2. 右下の 「トリガーを追加」 を選択。

    • 実行する関数:onFormSubmit

    • イベントのソース:「スプレッドシートから」

    • イベントの種類:「フォーム送信時」

  3. 「保存」を押すと、Googleアカウントの承認画面が出ます。

    • 自分のアカウントを選択 > 「詳細」「(プロジェクト名)に移動(安全ではない)」「許可」 をクリック。


これの意味が分からず永遠と安全なページに戻る(BACK TO SAFETY)を押し続けていました…。

1. なぜこの画面が出るのか?

セキュリティ上の保護

Google Apps Scriptは、スプレッドシートの読み書きやメールの送信など、強力な操作が可能です。悪意のあるプログラムが勝手にデータを操作しないよう、Googleは「公式に審査・承認されたアプリ」以外が動こうとすると、ユーザーに注意を促す仕組みになっています。

「未承認」の状態だから

あなたが自分で作ったスクリプトや、社内で共有されたばかりのスクリプトは、Googleによる個別の安全審査(認証)を受けていません。そのため、「どこの誰が作ったかわからない(Googleが保証していない)アプリが動こうとしていますよ」という警告が出ます。

自分で作成したスクリプトであれば、安全だとわかっているため、上記の手順で進めることができます。

⚠️注意

  • 信頼できるか確認する: 自分が書いたコードや会社から受け取ったものであれば問題ありません。

  • 知らない人からのリンクは避ける: 全く知らない人が作ったスクリプトでこの画面が出た場合は、安易に許可しないよう注意してください。ドライブ内のファイルが盗まれたり、勝手にメールを送られたりするリスクがあります。

無事承認が完了するとトリガーが作成されます。

🧪 動作確認:いざ、テスト送信

設定が終わったら、エディタの「実行」ボタンは押さず、実際のGoogleフォームからデータを送ります。

  1. フォームのプレビュー画面から「お昼は友達とランチ」と入力して送信。(日付はデフォルトから変更しないと期限なしで送信されました)

  2. 自分のメールフォルダを開き、数秒後に「【ToDo通知】」という件名のメールが届いていれば……完成です!

テストも含めた実行ログは先ほど作成したスプレッドシートにきちんと保存されていました。(テスト中の眠気の凄さがうかがえますね)

💡実装で学んだエラーが出たらここを確認

  • 「undefined」と出る: フォームの質問タイトルと、コード内の ['ToDoの内容'] が完全に一致しているか確認する。

  • メールが届かない: トリガーが正しく設定されているか、メールアドレスが正しく入力されているか見直しする。

✨ まとめ

今回の開発を通じて、「エラーメッセージをよく読むこと」と「一つずつ権限を確認すること」の大切さを学びました。 「今日は推し活なので早く寝る」といった些細なToDoも、自作ツールから届くと少し特別な気分になりますね。

次は、期限の前日に自動でリマインドを送る「定期実行機能」や自動でカレンダーに予定を追加してくれる機能を追加して、さらに便利にしていきたいと思います!

ありがとうございました!

著者について

運営担当のものです
AWS Community Builders(Security)
◼️認定資格
・AWS Certified Cloud Practitioner
・AWS Certified AI Practitioner
・AWS Certified Solutions Architect – Associate
・AWS Certified CloudOps Administrator – Associate
・AWS Certified Developer - Associate
現在All AWS Certifications Engineers 目指して奮闘中

いとさんをフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(Google Cloud)は、Google Cloudの多彩なAIや各種サービスを活用したワンストップソリューションを提供します。SCSKのノウハウや体制を有効活用し、業務課題の解決に必要な全体検討と組み合わせで、最適な業務実装まで支援します。

Google Cloudクラウド
シェアする
タイトルとURLをコピーしました