NI BLOG

ネイチャーインサイト株式会社の情報発信ブログ
SASに関する技術情報など

2026/05/07 技術関連

Google Apps Scriptを用いたBacklogからGoogle Chat Spaceへの通知カスタマイズ

Google Apps Scriptを用いたBacklogからGoogle Chat Spaceへの通知カスタマイズ

はじめに

お疲れ様です。
データアナリティクス部(以下、DA部) 樫山です。

先日、Google Apps Script(以下、GAS)を用いて、BacklogからGoogle Chat Space(以下、スペース)への通知機能を作成しました。
今回ご紹介する機能は実装が非常にシンプルで、「Backlogで課題管理」を行いながら「スペースでチームチャット」を活用しているプロジェクトであれば、すぐに活用できるものだと思います。

1. 背景と課題:標準機能の「もう一歩」を解消したい

会社のプロジェクトでは、日常的なコミュニケーションにはスペースを、課題管理にはBacklogを活用していました。
当初は標準の連携機能を使ってBacklogからの通知をスペースに飛ばしていましたが、運用を続ける中で以下のような「物足りなさ」を感じるようになりました。
・通知の取捨選択が難しい: 連携をONにするとプロジェクトの全通知が届いてしまい、重要な情報が埋もれやすい。
・タイミングのコントロールができない: 通知のトリガーがBacklog上の操作(更新など)に限られるため、「毎週決まった時間にリマインドしたい」「期限が近いものだけを通知したい」といった柔軟な運用ができない。

今回紹介する方法

これらの課題を解決するため、以下のフローで通知システムを構築しました。
1. GASでBacklogのデータを取得し、スプレッドシートに書き出す。
2. GASでスプレッドシートのデータを条件(種別や期限)でフィルタリングし、スペースに通知する。
3. GASのトリガー機能で、実行タイミングを自動化する。

これにより、「毎週月曜日の午前9時過ぎに、DA部の未完了課題だけをリマインドする」といった自由なカスタマイズが可能になりました。

 

2. 事前準備

実装にあたり、以下の情報が必要になります。

  • Backlog関連:
    • APIキー(個人設定から取得)
    • 通知を行いたいPJの「スペースID/ドメイン/プロジェクトキー」
  • Google関連:
    • データ保管用のスプレッドシート
    • Google Apps Script
    • Google Chat Space:通知先スペースとそのWebhook URL

 

3.Backlogからスプレッドシートにデータを取得する

まずはBacklogのAPIを叩いて、課題一覧を取得しスプレッドシートに展開するスクリプトを作成します。

設定手順

1. スプレッドシートを作成し、メニューの [拡張機能] > [Apps Script] を選択します。
2. エディタが開いたら、新しいスクリプトファイルを作成し、以下のコード(関数名:FromBacklog)を貼り付けます。
3. 「設定エリア」の各項目をご自身の環境に合わせて書き換えて保存し、実行します。

/**
 * Backlogから課題一覧を取得し、スプレッドシートに書き出す
 */
function FromBacklog() {
  // --- 設定エリア ---
  const API_KEY = 'YOUR_BACKLOG_API_KEY'; // ここにBacklogのAPIキーを貼り付け
  const SPACE_ID = 'YOUR_SPACE_ID'; // ここにBacklogのスペースIDを貼り付け
  const DOMAIN = '.backlog.com'; // ここにBacklogのドメインを貼り付け
  const PROJECT_KEY = 'PROJECT_KEY'; // ここにBacklogのプロジェクトキーを貼り付け

  // 1. プロジェクト情報を取得してIDを特定
  const pUrl = `https://${SPACE_ID}${DOMAIN}/api/v2/projects/${PROJECT_KEY}?apiKey=${API_KEY}`;
  const projectId = JSON.parse(UrlFetchApp.fetch(pUrl).getContentText()).id;

  // 2. 課題を取得
  const url = `https://${SPACE_ID}${DOMAIN}/api/v2/issues?apiKey=${API_KEY}&projectId[]=${projectId}&count=100&statusId[]=1&statusId[]=2&statusId[]=3`;
  const response = UrlFetchApp.fetch(url);
  const issues = JSON.parse(response.getContentText());

  // 3. 取得したデータを整理して配列に入れる
  let allRows = [];
  issues.forEach(issue => {
    allRows.push([
      issue.summary,                                     // 件名
      issue.status.name,                                 // ステータス
      issue.issueType ? issue.issueType.name : '',       // 種別
      issue.assignee ? issue.assignee.name : '未定',      // 担当者
      issue.dueDate ? issue.dueDate.substring(0, 10) : '', // 期限日
      `https://${SPACE_ID}${DOMAIN}/view/${issue.issueKey}` // URL
    ]);
  });

  // 4. スプレッドシートに書き出す
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.clearContents();
  sheet.appendRow(['件名', 'ステータス', '種別', '担当者', '期限日', 'URL']);
 
  if (allRows.length > 0) {
    sheet.getRange(2, 1, allRows.length, allRows[0].length).setValues(allRows);
    sheet.getRange(2, 1, allRows.length, allRows[0].length).sort({column: 5, ascending: true});
  }
}

下記画像のように、スプレッドシートに課題一覧が正しく出力されていれば成功です。


 

4. スプレッドシートからスペースに通知する

次に、シートに書き出されたデータの中から必要なものだけを抽出し、スペースへ通知するスクリプトを作成します。

設定手順

1. 新しいスクリプトファイルを作成し、以下のコード(関数名:ToSpace)を貼り付けます。
2. 「設定エリア」のWEBHOOK_URLをご自身の環境に合わせて書き換えて保存し、実行します。

/**
 * スプレッドシートから特定のタスクを抽出してGoogle Chatへ通知する
 */
function ToSpace() {
  // --- 設定エリア ---
  const WEBHOOK_URL = 'YOUR_WEBHOOK_URL'; // ここにスペースのWebhookURLを貼り付け
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  // 1. データがない場合の処理
  if (lastRow  row[2] === 'DA部');

  // 3. 通知メッセージの組み立て
  let messageBody = "";
  if (targetTasks.length === 0) {
    messageBody = "【週次通知】現在、対象の未完了課題はありません。";
  } else {
    messageBody = "【週次通知】対応が必要な課題一覧\n\n";
    
    targetTasks.forEach(row => {
      const [subject, status, type, person, dateValue, url] = row;      
      const ymd = dateValue ? Utilities.formatDate(new Date(dateValue), "JST", "yyyy年MM月dd日") : "未設定";
      messageBody += `• \n`;
      messageBody += `  期限:${ymd} / 担当:${person} / 状況:${status}\n\n`;
    });
  }

  // 4. Google Chatへ送信
  postChat(WEBHOOK_URL, messageBody);
}

/**
 * チャット送信用の共通関数
 */
function postChat(url, text) {
  const payload = { "text": text };
  const options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };
  UrlFetchApp.fetch(url, options);
}

下記画像のように、通知したい課題がスペースに通知されていれば成功です。
※今回は[種別 = DA部]のみが通知されるようになっています。


 

5. トリガーで自動化する

最後に、作成した関数を自動実行する設定を行います。

  1. 1. GASエディタの左メニューにある [トリガー](時計アイコン) を開きます。
  2. 2. [トリガーを追加] をクリックし、以下のように設定します。
  • FromBacklog(データ取得)の設定:
    • ・実行する関数:FromBacklog
    • ・イベントのソース:時間主導型
    • ・トリガータイプ:週ベースのタイマー
    • ・曜日:毎週月曜日
    • ・時刻:午前8時~9時
  • ToSpace(通知)の設定:
    • ・実行する関数:ToSpace
    • ・イベントのソース:時間主導型
    • ・トリガータイプ:週ベースのタイマー
    • ・曜日:毎週月曜日
    • ・時刻:午前9時~10時(※データ取得より後に実行されるよう調整)

これで、下記画像のように毎週月曜日に最新の課題状況が自動的にスペースへ届くようになります!


 

おわりに

今回は、私の所属するプロジェクトの課題に合わせて、GASを用いたBacklogとスペースの連携カスタマイズをご紹介しました。
プロジェクトやチームの体制によって最適な運用方法は異なりますが、「もっと効率よくできないか」「タスクを軽量化できないか」という改善の意識を持つことが何よりも重要だと感じています。
今は、改善のアイデアさえ思いつけば、プログラムの実装部分は生成AIが強力にサポートしてくれる時代です。つまり、改善は私たちの「モチベーション」と「行動力」次第で実現できる時代になりつつあると感じています。
日頃お客様の課題解決に注力している私たちだからこそ、自分たちの足元にも目を向け、より良い環境を自らの手で作っていく姿勢を大切にしていきたいですね。
本記事が、皆さんのチーム作業向上のヒントになれば幸いです。

コメント

※投稿されたコメントは、管理者によって承認された後に掲載されます。