yuchieh.chao

【初心者向け】GoogleスプレッドシートとGASでSlack担当者通知Botを作る

チーム運営でよくある課題のひとつが、「今日の担当者は誰か」をすぐに共有できないことです。

Googleスプレッドシートで担当情報を管理し、Google Apps Script(GAS)を使ってSlackへ自動通知すれば、この課題をシンプルに解決できます。

こんな用途に向いている

この仕組みは、以下のような場面に特に向いています。

  • 日替わり担当者の自動共有(例:作業担当の通知)
  • 複数メンバーのローテーション管理
  • 祝日・休日は自動でスキップしたい場合

小規模なチームや、まずは簡単に自動化を始めたい場合にとても相性のよい方法です。

全体の仕組み

流れはシンプルです。

  1. Googleスプレッドシートに、週ごとの担当者を曜日別に入力する
  2. GASが毎朝決まった時間にシートを読み取る
  3. 当日の日付と照合して担当者を特定する
  4. 祝日リストを参照し、休日であれば通知をスキップする
  5. 担当者名をメッセージとして整形し、Slackのチャンネルへ自動送信する

つまり、スプレッドシートを更新するだけで、その内容が翌日以降のSlack通知に自動で反映される仕組みです。

準備するもの

事前に次の3つを用意します。

  • Googleアカウント
  • Googleスプレッドシート
  • Slackの通知先チャンネル

Slack側は、Incoming Webhook を使う方法がもっとも簡単です。

より柔軟な連携をしたい場合は、Slack Appを作成してメッセージ送信APIを使う方法もあります。

スプレッドシートの設計例

このシートは、週カレンダー形式で設計されています。

基本構成

セル内容

A1

年(例:2026)

B1

月(例:4)

A2〜G2

曜日ヘッダー(月・火・水・木・金・土・日)

奇数行(3行目以降)

各曜日の日付(例:2026/04/01)

偶数行(4行目以降)

各曜日の担当者名(例:Aさん、Bさん、Cさん)

週ごとに「日付行 → 担当者行 → 空白行」の3行セットで繰り返す構成です。

担当者一覧・祝日リスト

列内容

I列

担当者一覧(Aさん、Bさん、Cさん)

J列

祝日の日付リスト

K列

祝日名

GASの基本コード例

以下は、Slackへ通知を送る最小構成のイメージです。

この関数に、スプレッドシートから読み取った担当者情報を渡せば、Slackに自動投稿できます。

plaintext
// Webhook URLはご自身のものに差し替えてくださいconst SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX';
const SHEET_NAME = 'シート1';
function sendDutyNotificationToSlack() {
  const timezone = 'Asia/Tokyo';  const today = new Date();  const todayStr = Utilities.formatDate(today, timezone, 'yyyy/MM/dd');
  console.log('=== 通知スクリプト開始 ===');  console.log(`今日: ${todayStr}`);
  // ✅ 週末判定(0=日曜, 6=土曜)  const dayOfWeek = today.getDay();  if (dayOfWeek === 0 || dayOfWeek === 6) {    console.log('⏭️  週末のため通知をスキップします');    return;  }
  const ss = SpreadsheetApp.getActiveSpreadsheet();  const sheet = ss.getSheetByName(SHEET_NAME);
  if (!sheet) {    console.error('シートが見つかりません: ' + SHEET_NAME);    return;  }
  // ✅ データがある行だけを取得  const lastRow = sheet.getLastRow();  if (lastRow === 0) {    console.log('⚠️  スプレッドシートにデータがありません');    return;  }
  const range = sheet.getRange(1, 1, lastRow, 7);  const data = range.getValues();
  let dutyPerson = null;  let foundDate = null;
  for (let i = 0; i < data.length; i++) {    for (let j = 0; j < data[i].length; j++) {      let cellValue = data[i][j];      if (!cellValue) continue;
      const cellDateStr = cellValue.toString().trim();
      // 今日の日付と一致するか確認      if (cellDateStr === todayStr) {        console.log(`✅ 日付発見: 行 ${i + 1}, 列 ${String.fromCharCode(65 + j)} = "${cellDateStr}"`);        foundDate = cellDateStr;
        // 同じ列の1行下が担当者        if (data[i + 1] && data[i + 1][j] !== undefined) {          dutyPerson = data[i + 1][j];          console.log(`担当者: "${dutyPerson}"`);        }        break;      }    }    if (foundDate) break;  }
  const todayDisplay = Utilities.formatDate(today, timezone, 'MM/dd');
  // ✅ 担当者判定  const dutyPersonStr = dutyPerson ? dutyPerson.toString().trim() : '';  const hasValidDuty = dutyPersonStr !== '' && dutyPersonStr !== 'ー' && dutyPersonStr !== '—';
  if (hasValidDuty) {    const message = `${todayDisplay} 担当者は ${dutyPersonStr}さんです。\nよろしくお願いいたします。\n本日の対応窓口をお願いします。`;
    const payload = {      'text': message,      'username': '作業担当の当番通知',      'icon_emoji': ':calendar:'    };
    try {      const options = {        'method': 'post',        'contentType': 'application/json',        'payload': JSON.stringify(payload),        'muteHttpExceptions': true      };
      const response = UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
      if (response.getResponseCode() === 200) {        console.log(`✅ Slack通知を送信しました: ${dutyPersonStr}`);      } else {        console.error(`❌ Slack送信エラー: ${response.getResponseCode()}`);      }    } catch (e) {      console.error(`❌ Slack送信エラー: ${e.toString()}`);    }
  } else {    if (foundDate) {      console.log('⏭️  通知をスキップ - 本日の担当者はいません');    } else {      console.log('⚠️  本日の日付がスプレッドシートに見つかりません');    }  }
  console.log('=== 通知スクリプト終了 ===');}

実際には、対象行を固定するのではなく onEdit トリガーや定期実行で柔軟に処理することが多いです。

トリガーの設定

このシートでは、時間主導トリガーが最も実運用に向いています。

毎朝9時など、業務開始前の決まった時間に sendDutyNotificationToSlack() を実行するよう設定すると、担当者が出社前にSlackで確認できます。

GASのトリガー設定手順は次のとおりです。

  1. GASエディタの左メニューから「トリガー(時計アイコン)」を開く
  2. 「+トリガーを追加」をクリック
  3. 実行する関数:sendDutyNotificationToSlack
  4. イベントのソース:時間主導型
  5. 時間の種類:日タイマー
  6. 時刻:午前9時〜10時などを選択

通知文の例

Slackに届くメッセージのイメージはこのようになります。

【担当通知】
05/20 担当者は A さんです。
よろしくお願いいたします。
本日の対応窓口をお願いします。

このようにすると、Slack上でもすぐ内容を把握できます。

運用のポイント

実運用では、次の点に注意すると安定します。

  • Webhook URL を公開しない。
  • テスト用チャンネルで事前確認する。
  • 担当者が変わった場合はシートのI列の担当者一覧も更新する。

最初はシンプルに作って、必要に応じて条件分岐や例外処理を追加していくのがよい進め方です。

まとめ

GoogleスプレッドシートとGASを組み合わせると、低コストで実用的なSlack通知Botを作れます。

このシートのように「週カレンダー形式 × 担当者ローテーション × 祝日リスト」の構成にしておくと、GAS側で「今日の担当者が誰か」を自動的に特定でき、手動での連絡作業をほぼゼロにできます。

まずは「シート読み取り → 担当者特定 → Slack通知」の最小構成から始めるのが成功しやすいです。

現在: IT PORTbonvoyageに切替