1. はじめに
本記事では、非エンジニアでも実践できる Google Apps Script 活用法について、イベント調整を例に解説をしていきます。
2. いま抱えている課題:調整コストと情報分散
- 同じイベント情報を何度も入力──スプシ、カレンダー、メールなどに重複記入
- リマインド漏れ・ダブルブッキング──担当ごとに連絡手段が異なり見落としが発生
- 属人化した運営フロー──担当者交代時にノウハウが引き継がれない
ポイント
予定データを“1 か所”に集約し、他サービスへ自動反映すれば調整作業が大幅に削減可能。
3. 解決のカギは「スプレッドシート中心設計」
| インプット | 中心 | アウトプット | 
|---|---|---|
| 社員・講師が入力するイベント情報 | スプレッドシート | Googleカレンダー / Slack / Discord / LINE 通知 | 
スプレッドシートを唯一の真実(Single Source of Truth)にすることで、
データ更新→自動スクリプト発火→各チャネルへ同期 というシンプルな流れが実現します。
4. Google Apps Script(GAS)入門
- GASとは
 Google が提供する JavaScript ベースのクラウド実行環境。ブラウザさえあればセットアップ不要で始められます。
- できること
- スプシやカレンダーの読み書き
- Gmail 送信、Google Drive 操作
- 外部 Webhook/API 連携
 
- 無料枠
 無償アカウントでは日次実行数やメール送信数に制限があります。大量処理が必要な場合は Google Workspace を検討しましょう。
5. デモで学ぶステップバイステップ自動化
5-1. スプレッドシートの準備
| A列 | B列 | C列 | D列 | 
|---|---|---|---|
| 日付 | 開始時刻 | 終了時刻 | イベント名 | 
- 列固定で Apps Script から読み取りやすく
- コミュニティ運営なら「担当」「場所」「通知先」など追加列も推奨
5-2. イベント一括生成/削除ロジック
function syncCalendar() {
  const sheet   = SpreadsheetApp.getActiveSheet();
  const events  = CalendarApp.getDefaultCalendar();        // プライマリ
  const rows    = sheet.getDataRange().getValues().slice(1);
  // ① 既存の “ダミー” や “予定ロック” を一旦削除
  const now  = new Date();
  const end  = new Date(now);
  end.setMonth(end.getMonth() + 1);
  events.getEvents(now, end).forEach(e => {
    if (e.getTitle().startsWith('予定ロック') ||
        e.getTitle().startsWith('ダミー')) {
      e.deleteEvent();
    }
  });
  // ② スプシから読み込んで再生成
  rows.forEach(r => {
    const [date, start, finish, title] = r;
    if (!title) return;
    const s = new Date(`${Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd')} ${start}`);
    const f = new Date(`${Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd')} ${finish}`);
    events.createEvent(title, s, f);
  });
}
コツ
まず削除→再生成と割り切るとロジックがシンプル。大量データの場合は差分同期のほうが高速です。
5-3. 飲み会後の「予定ロック」と翌朝自動解除
- 判定基準を正規表現化 const isParty = /飲み会|懇親会|歓迎会|親睦会/;
- 対象イベントが見つかったら 同日の19 時-24 時まで「予定ロック」 を追加
- 翌朝5 時にロックを削除するトリガー関数 cleanupLocks()を実行
5-4. トリガー設定と運用のコツ
- 1 時間おきの定期トリガー:新規/変更を即座に反映
- 日次トリガー(05:00):前日分のロック解除
- オンオープンメニュー function onOpen() { SpreadsheetApp.getUi() .createMenu('カレンダー管理') .addItem('予定を同期', 'syncCalendar') .addItem('ロックを再生成', 'createLocks') .addItem('トリガー再設定', 'installTriggers') .addToUi(); }ノーコードのメニュー操作に落とすことで、運営メンバーがスクリプトエディタを開かなくても済みます。
6. 開発効率を高めるツール活用
6-1. CLASPでローカル開発を快適に
- npm i -g @google/claspでインストール
- clasp clone <ScriptID>で手元にコードを落とし Git 管理
- VS Code などの IDE が使えるため Lint・補完・バージョン管理 が容易
6-2. Cursor+AIエージェントで高速コーディング
- ファイルを開いて「/ask」コマンドで要件を自然言語入力
- エージェントが 要件定義書(Markdown)→ コード雛形→ テスト を自動生成
- チャットGPTよりも「変更履歴」「差分プレビュー」が明快で長期運用に向く
6-3. 音声入力×AIプロンプト術
- Chrome拡張 Voice In:1 日1 時間まで無料
- 文字起こし支援 SuperWhisper:長時間の日本語も高精度
- 5 分間ノンストップ音声入力のトレーニングで、プロンプト作成スピードが飛躍的に向上
7. 運用をラクにする発展アイデア
| 目的 | 方法 | ポイント | 
|---|---|---|
| Slack/Discord への自動リマインド | Incoming Webhook + GAS | 夕方18 時に当日イベントを告知 | 
| LINE 通知 | LINE Notify API + GAS | 参加者個人へのピンポイント連絡も可 | 
| 動画アーカイブ管理 | Zoom 録画 URL を取得→スプシへ→YouTube へ自動アップロード | ダウンロード忘れ・パスワード共有漏れを防止 | 
| KPI 集計 | スプシ→Looker Studio 連携 | イベント回数/参加率の可視化 | 
8. パフォーマンス改善と安全対策
- 実行時間短縮
- 1 件ずつ API コールせず、Calendar.Events.batchUpdate()(Advanced Services)でまとめて処理
 
- 1 件ずつ API コールせず、
- カレンダーIDの外部化
- スクリプトプロパティに保存し、PropertiesService.getScriptProperties()で参照
 
- スクリプトプロパティに保存し、
- 権限を最小化
- 編集権限が不要な利用者は「メニュー操作のみ」のビューア権限に設定
 
9. よくある質問(Q&Aダイジェスト)
| 質問 | 回答(要約) | 
|---|---|
| チャットGPTだけで実装できますか? | 可能ですが、長期運用コードは Cursor のほうが誤コピーやバージョン管理ミスを防げます。 | 
| プログラミング初心者でも大丈夫? | まずは①困りごとを書き出す→②GASサンプルをコピペ→③AIに修正指示、の3ステップがおすすめ。 | 
| カレンダーの集計はできる? | 予定をスプシに書き出し、ピボットテーブルや Looker Studio で可視化可能。 | 
| 無料で使える音声入力は? | VoiceIn(Chrome拡張)が1 日1 時間無料。短時間なら Windows HキーでもOK。 | 
10. まとめ──自動化で得られる3つのメリット
- 調整時間を最大90 %削減
 ─ 同じ情報を複数サービスに入力する手間が消える
- ダブルブッキング防止
 ─ 「予定ロック」で深夜・飲み会後の誤予約を自動回避
- 属人化リスクを低減
 ─ スプシ中心設計+メニュー操作でメンバー交代時も安心
11. 参考リンク & 次の学習ステップ
- 公式ドキュメント
- Google Apps Script:https://developers.google.com/apps-script
- CLASP:https://github.com/google/clasp
 
- 学習プラン例
- スプシ操作関数(3 日)
- カレンダーAPI基礎(2 日)
- トリガーと通知(2 日)
- CLASP + Cursor環境構築(1 日)
 
この記事を活用して、チームの調整業務を“ボタン1つ”で自動化してみてください。
「手入力のムダ」をなくし、空いた時間でよりクリエイティブな業務に集中できるようにしていきましょう!
 
  
  
  
  
