あなたが現在見ているのは スプレッドシート更新をChatworkに自動通知する方法|GASで業務自動化

スプレッドシート更新をChatworkに自動通知する方法|GASで業務自動化

Googleスプレッドシートの更新をきっかけに、Chatworkへ自動で通知する方法を解説します。

本記事・動画では、Google Apps Script(GAS)を使って
・セル編集時にChatworkへ通知
・特定シート/特定行のみ通知
・業務で使える実践的な構成
をステップごとに紹介します。

「更新の見逃しを防ぎたい」
「手動連絡をやめて業務を自動化したい」
という方におすすめの内容です。

▼ この記事・動画でできること
・スプレッドシート更新をトリガーに通知
・Chatwork APIの基本的な使い方
・GASトリガー設定のポイント

▼ こんな方におすすめ
・業務でスプレッドシートを使っている方
・Chatworkで情報共有しているチーム
・GASで業務自動化を始めたい初心者の方

導入と設定の3ステップ

1. Chatwork APIトークンの取得 

Chatwork画面右上のユーザーアイコンから「サービス連携」 > 「API設定」へ進み、APIトークンを発行します。取得したトークンを、スクリプト内のCHATWORK_API_TOKENの値として設定してください。
APIトークン発行ページはこちら

2. ルームIDの確認と設定 

通知を送りたいChatworkのルームを開き、ブラウザのURLを確認します。末尾にある#!rid1234567の数字部分がルームIDです。このIDをスクリプト内のCHATWORK_ROOM_IDS配列に設定します。複数ある場合はカンマで区切って追加してください。(例: ['1234567', '8901234']

3. スプレッドシートにコードを導入(GASに貼り付け)

  1. 対象のスプレッドシートを開く
  2. メニュー 「拡張機能」→「Apps Script」
  3. プロジェクトが開いたら、左の 「コード.gs」(または新規ファイル)にあなたのコードを貼り付け
  4. 保存(Ctrl+S)

4.ChatworkのAPI・ルームID情報をGAS側にいれる。

下記のコード内のCHATWORK_TOKENCHATWORK_ROOM_ID部分を書き換えます。

  1. 書き換え項目
    • CHATWORK_TOKEN = (APIトークン)
    • CHATWORK_ROOM_ID = (通知したいルームID)

1つのルームに通知すればいい場合は、’YOUR_ROOM_ID_2’を削除してください。

コードはこちら

/**
 * 設定項目
 * ChatworkのAPIトークンと通知先のルームIDを設定してください。
 */
const CHATWORK_API_TOKEN = 'YOUR_CHATWORK_API_TOKEN'; // ここにAPIトークンを入力

/**
 * 通知先のルームIDを配列で指定してください
 * 例: ['1234567', '8901234']
 */
const CHATWORK_ROOM_IDS = ['YOUR_ROOM_ID_1', 'YOUR_ROOM_ID_2']; 

/**
 * 通知対象とするシート名を指定する場合(空配列 [] の場合はすべてのシートが対象)
 * 例: ['シート1', '重要データ']
 */
const TARGET_SHEETS = []; 

/**
 * スプレッドシートが編集されたときに実行される関数
 */
function onSheetEdit(e) {
  // 手動実行(引数 e がない場合)は何もしない
  if (!e) {
    console.log('この関数はスプレッドシートの編集時に自動で実行されます。');
    return;
  }

  const range = e.range;
  const sheet = e.source.getActiveSheet();
  const sheetName = sheet.getName();
  
  // 特定のシートのみを対象にする場合の判定
  if (TARGET_SHEETS.length > 0 && TARGET_SHEETS.indexOf(sheetName) === -1) {
    return;
  }

  const row = range.getRow();
  
  // A列, B列, C列の値を同じ行から取得
  const rowData = sheet.getRange(row, 1, 1, 3).getValues()[0];
  const valA = rowData[0];
  const valB = rowData[1];
  const valC = rowData[2];

  /**
   * 【修正ポイント】
   * A列、B列、C列のいずれかが空の場合は通知をスキップする
   */
  if (valA === '' || valB === '' || valC === '') {
    console.log('A, B, C列のすべてが埋まっていないため、通知をスキップしました。');
    return;
  }

  const ssUrl = e.source.getUrl();
  const user = Session.getActiveUser().getEmail();
  const newValue = e.value;

  // 通知メッセージの作成
  let message = '■スプレッドシートが更新されました(全項目入力完了)\n';
  message += 'URL: ' + ssUrl + '\n';
  message += 'シート名: ' + sheetName + '\n';
  message += '編集セル: ' + range.getA1Notation() + '\n';
  message += '今回の入力値: ' + (newValue || range.getValue() || '(入力)') + '\n\n';
  
  message += '【行のデータ】\n';
  message += 'A列: ' + valA + '\n';
  message += 'B列: ' + valB + '\n';
  message += 'C列: ' + valC + '\n\n';
  
  message += '更新者: ' + user;

  // 全てのルームへ送信
  sendToChatwork(message);
}

/**
 * Chatwork APIを叩いてメッセージを送信する(複数ルーム対応)
 */
function sendToChatwork(body) {
  if (!body) return;

  CHATWORK_ROOM_IDS.forEach(roomId => {
    const url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
    
    const options = {
      'method': 'post',
      'headers': {
        'X-ChatworkToken': CHATWORK_API_TOKEN
      },
      'payload': {
        'body': body
      },
      'muteHttpExceptions': true
    };

    try {
      const response = UrlFetchApp.fetch(url, options);
      const responseCode = response.getResponseCode();
      if (responseCode !== 200) {
        console.error('Room ID: ' + roomId + ' Error: ' + response.getContentText());
      } else {
        console.log('Room ID: ' + roomId + ' Success');
      }
    } catch (error) {
      console.error('Fetch Error (Room ID: ' + roomId + '): ' + error.toString());
    }
  });
}

/**
 * テスト送信用の関数
 */
function testNotification() {
  sendToChatwork('スプレッドシートからのテスト通知です。');
}

5. GASの「トリガー」を設定 

このスクリプトを自動で動かすための重要な設定です。

    ◦ スプレッドシートの拡張機能から、クリックします。    

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

    ◦ 右下の「トリガーを追加」ボタンを押します。

    ◦ 実行する関数を選択: onSheetEdit を選びます。

    ◦ イベントの種類を選択: 編集時 を選びます。

    ◦ 「保存」をクリックします。初回保存時にはGoogleアカウントへのアクセス許可を求められるので、承認してください。

これで設定は完了です。スプレッドシートのセルを編集すると、指定したChatworkルームに自動で通知が届くようになります。

6. 仕様について 

1.行を削除したりしても通知が行ってしまう問題の解決

「値が入力された時のみ」通知が飛ぶように、条件分岐を追加しました。

具体的には、編集されたセルの値が空(削除やクリア操作)である場合は、処理を中断するように設定しています。

修正内容の解説

  1. 空入力の判定: if (!newValue && !range.getValue()) という条件を追加しました。
    • e.value は単一のセルを編集した際の新しい値を保持しますが、削除した場合は空になります。
    • 貼り付け(ペースト)などで複数セルが更新された場合、e.value は undefined になるため、補完的に range.getValue() をチェックして「本当に空かどうか」を判定しています。
  2. 通知のスキップ: データが消された(=セルが空になった)時は return して、それ以降の Chatwork 送信処理を実行しないようにしました。

これで、行を削除したり、セルの内容を消したりした際には通知が飛ばず、新しい情報が書き込まれた時だけ通知されるようになります。

2.「値が入力された通知の不要な項目の削除

通知時に[info][title]スプレッドシートが更新されました[/title] と、[info][title] [/title]が表示されてしまっていた。

コードから、Chatwork独自の枠組み表示([info][title] タグ)を削除し、シンプルなテキスト通知になるよう修正しました。

枠組みタグ(BBコード)を取り除き、先頭に「■」を付けるなどして見やすさを維持したプレーンテキスト形式に変更しました。これにより、Chatwork上での余計な装飾が表示されなくなります。

3.複数のチャットルームに同時通知したい

複数のチャットルーム(ルームID)へ同時に通知を送れるようにスクリプトを更新しました。

設定項目の CHATWORK_ROOM_IDS を配列形式(['ID1', 'ID2'])に変更し、ループ処理でそれぞれのルームへメッセージを飛ばすようにしています。

変更のポイント

  1. CHATWORK_ROOM_IDS: 変数名を複数形にし、['ID1', 'ID2'] のようにカンマ区切りで複数のIDを入力できるようにしました。
  2. sendToChatwork 内のループ: forEach を使って、指定されたすべてのルームIDに対して順番にメッセージを送信します。

設定が完了したら、前回同様に testNotification を実行して、それぞれのチャットルームにメッセージが届くか確認してみてください。

4.スプレッドシートのURLも通知項目に入れたい

通知する内容は、 スプレッドシートのA列、B列、C列の内容だけでなく、シートURLも通知

通知内容にスプレッドシートのURLが含まれるよう、Canvasのコードを更新しました。

通知メッセージの冒頭に URL: [スプレッドシートのURL] が表示されるように変更しました。これにより、通知からすぐに該当のファイルへアクセスできるようになります。

5.A列を書いている途中で、通知され、B列を書いたらまた通知されてしまう問題の解決

A列、B列、C列のすべてに値が入力されたタイミングでのみ通知が飛ぶように、条件判定を追加しました。

この修正により、例えばA列だけを入力した段階では通知されず、最後にC列(あるいは足りなかった列)を入力して3つの項目が揃った瞬間に一度だけ通知が飛ぶようになります。

3つの列がすべて埋まった状態で行内のどこかを編集(あるいは最後に足りなかった列を入力)したときに通知が送られます。

if (valA === '' || valB === '' || valC === '') という条件を追加しました。

これにより、A列・B列・C列のうち1つでも未入力(空文字)がある場合は、Chatworkへの送信処理を行わずに終了します。

本シートは、ABC列のみの情報で事足りるためにこのようにしておりますので、DEF以降も項目が入っている場合は、 || valD === ''移行を追加してください。

コメントを残す