[GAS] GASで自動化する!スプレッドシートのデータを定期的にSlackに通知する方法

GAS

ビジネスの現場では、データの共有と通知が効率化のカギとなります。特に、Google スプレッドシートのデータを定期的にチームメンバーに共有したい場合、毎回手動で行うのは非効率です。この記事では、Google Apps Script(GAS)を使って、スプレッドシートのデータを自動的にSlackに通知する方法を解説します。

スポンサーリンク

はじめに:なぜGASとSlackの連携が便利か

Google Apps Script(GAS)はGoogleのサービスを自動化するための強力なツールです。一方、Slackは現代のビジネスコミュニケーションに欠かせないツールとなっています。両者を連携させることで、以下のようなメリットが得られます:

  • 手動作業の削減と人為的ミスの防止
  • 情報共有の迅速化とタイムリーな意思決定
  • チーム全体での情報の透明性向上
  • データ駆動型の組織文化の促進

たとえば、日次売上レポート、在庫状況、タスク期限などを自動的にSlackチャンネルに通知することで、チームメンバー全員が最新情報を把握しやすくなります。



準備:必要なものと前提条件

この連携を実現するために、以下のものが必要です:

  1. Googleアカウント(スプレッドシートとGASを使用するため)
  2. Slackワークスペース(管理者権限があるとより便利)
  3. 基本的なプログラミングの知識(JavaScript)

前提としては、通知したいデータを含むGoogleスプレッドシートがすでに存在していることを想定しています。

Slack側の設定:Incoming Webhookの取得

まず、Slackからスプレッドシートのデータを受け取るための「Incoming Webhook」を設定します。

  1. Slack APIにアクセスし、「Create New App」をクリックします。
  2. アプリ名を入力し、使用するワークスペースを選択します。
  3. 左メニューの「Incoming Webhooks」をクリックし、「Activate Incoming Webhooks」をオンにします。
  4. 「Add New Webhook to Workspace」をクリックし、通知を送信するチャンネルを選択します。
  5. 「許可する」をクリックして、Webhook URLを取得します。このURLは後で使用するため、安全に保管しておいてください。

GASの基本的な書き方

まず、Google Apps Scriptの基本的な使い方を確認しましょう:

  1. スプレッドシートを開き、「ツール」>「スクリプトエディタ」をクリックします。
  2. 新しいスクリプトファイルが開きます。ここにJavaScriptベースのコードを記述します。
  3. 初期設定では、function myFunction() { } という空の関数が表示されています。

基本的なGASの構造は以下のようになります:

// グローバル変数とコンスタント
const SLACK_WEBHOOK_URL = 'あなたのWebhook URL';

// メイン関数
function sendToSlack() {
  // スプレッドシートからデータを取得
  const data = getDataFromSheet();
  
  // Slackに送信
  postToSlack(data);
}

// ヘルパー関数
function getDataFromSheet() {
  // データ取得処理
}

function postToSlack(data) {
  // Slack送信処理
}

スプレッドシートからデータを取得するコード

次に、スプレッドシートからデータを取得するコードを作成します:

function getDataFromSheet() {
  // アクティブなスプレッドシートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // データ範囲を指定して値を取得(例:A2:D10)
  const dataRange = sheet.getRange("A2:D10");
  const values = dataRange.getValues();
  
  // ヘッダー行を取得
  const headers = sheet.getRange("A1:D1").getValues()[0];
  
  // データを整形
  let formattedData = [];
  for (let i = 0; i < values.length; i++) {
    if (values[i][0] === "") continue; // 空行をスキップ
    
    let row = {};
    for (let j = 0; j < headers.length; j++) {
      row[headers[j]] = values[i][j];
    }
    formattedData.push(row);
  }
  
  return formattedData;
}

このコードでは、スプレッドシートの特定範囲(ここではA2:D10)からデータを取得し、ヘッダー行(A1:D1)を使って各データに意味を持たせています。

Slackに通知を送るコード

取得したデータをSlackに送信するコードを作成します:

function postToSlack(data) {
  // Slack用メッセージの作成
  let message = {
    "blocks": [
      {
        "type": "header",
        "text": {
          "type": "plain_text",
          "text": "📊 スプレッドシートデータ更新通知",
          "emoji": true
        }
      },
      {
        "type": "section",
        "text": {
          "type": "mrkdwn",
          "text": "*本日のデータ更新をお知らせします*"
        }
      },
      {
        "type": "divider"
      }
    ]
  };
  
  // データをメッセージに追加
  for (let i = 0; i < data.length; i++) {
    const row = data[i];
    let rowText = "";
    
    for (const key in row) {
      rowText += `*${key}:* ${row[key]}\n`;
    }
    
    message.blocks.push({
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": rowText
      }
    });
    
    // 行間のセパレータを追加(最後の行以外)
    if (i < data.length - 1) {
      message.blocks.push({
        "type": "divider"
      });
    }
  }
  
  // Slackに送信
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(message)
  };
  
  // Webhook URLを使用して送信
  const response = UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
  
  // 送信結果をログに出力
  Logger.log(response.getContentText());
}

このコードでは、Slackの「Block Kit」形式を使用して、見やすく整形されたメッセージを作成しています。



定期実行の設定方法

コードを定期的に実行するために、GASのトリガーを設定します:

  1. スクリプトエディタで、「トリガー」アイコン(時計マーク)をクリックします。
  2. 「トリガーを追加」をクリックします。
  3. 以下の設定を行います:
    • 実行する関数: sendToSlack
    • イベントのソース: 「時間主導型」
    • 時間ベースのトリガーのタイプ: 「日付ベースのタイマー」
    • 時刻: 実行したい時間(例:「午前9時〜10時」)
    • 引数: 空欄のまま
  4. 「保存」をクリックします。

これで、指定した時間に自動的に関数が実行され、スプレッドシートのデータがSlackに通知されるようになります。

応用例:条件付き通知とフォーマット調整

より高度な使い方として、特定の条件を満たすデータのみを通知したり、通知の見た目をカスタマイズしたりする方法を紹介します。

条件付き通知

function getDataFromSheet() {
  // 前述のコードと同様...
  
  // 条件でフィルタリング(例:「状態」列が「緊急」のデータのみ)
  let formattedData = [];
  for (let i = 0; i < values.length; i++) {
    if (values[i][0] === "") continue; // 空行をスキップ
    
    let row = {};
    for (let j = 0; j < headers.length; j++) {
      row[headers[j]] = values[i][j];
    }
    
    // 「状態」列が「緊急」の場合のみ追加
    if (row['状態'] === '緊急') {
      formattedData.push(row);
    }
  }
  
  return formattedData;
}

通知フォーマットのカスタマイズ

function postToSlack(data) {
  // 基本的なメッセージ構造
  let message = {
    "blocks": [
      {
        "type": "header",
        "text": {
          "type": "plain_text",
          "text": "🚨 緊急タスク通知",
          "emoji": true
        }
      }
    ],
    "attachments": [
      {
        "color": "#FF0000", // 赤色のサイドバー
        "blocks": []
      }
    ]
  };
  
  // データをメッセージに追加
  for (let i = 0; i < data.length; i++) {
    const row = data[i];
    
    // タスク情報をフォーマット
    message.attachments[0].blocks.push({
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": `*${row['タイトル']}*\n優先度: ${row['優先度']}\n担当者: ${row['担当者']}\n期限: ${row['期限']}`
      }
    });
    
    // アクションボタンを追加
    message.attachments[0].blocks.push({
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": {
            "type": "plain_text",
            "text": "詳細を確認",
            "emoji": true
          },
          "url": "https://docs.google.com/spreadsheets/d/your-spreadsheet-id/"
        }
      ]
    });
    
    // セパレータを追加
    if (i < data.length - 1) {
      message.attachments[0].blocks.push({
        "type": "divider"
      });
    }
  }
  
  // Slackに送信
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(message)
  };
  
  const response = UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);
  Logger.log(response.getContentText());
}

トラブルシューティング

GASとSlackの連携で一般的に発生する問題と解決策を紹介します:

  1. Webhook URLの不正確さ
    • 解決策:Webhook URLを再確認し、誤りがないことを確認してください。
  2. API制限の問題
    • 解決策:GASの1日あたりの実行回数には制限があります。頻度を下げるか、複数のスクリプトに分割してください。
  3. データ形式の問題
    • 解決策:Slackに送信するJSONデータの形式を確認し、適切にフォーマットされていることを確認してください。
  4. 空のデータセットの処理
    • 解決策:データが空の場合の処理を追加してください。例:
if (formattedData.length === 0) {
  Logger.log('通知するデータがありません');
  return;
}
  1. デバッグ方法
    • 解決策:Logger.log()を使用してデータの状態を確認し、エラーが発生している場所を特定してください。

まとめ

Google Apps Script(GAS)とSlackの連携により、スプレッドシートのデータを自動的にSlackに通知することができるようになりました。
この自動化により、チームの情報共有を効率化し、データドリブンな意思決定をサポートすることができます。

コメント

タイトルとURLをコピーしました