GASからGoogleチャットにメッセージを送信する方法

今回はGoogle チャットでGASから月末月初に、社員全員に自動で一斉連絡する方法をご紹介いたします。

Webhook URLを取得する

有料版(Google Workspace)のGoogleチャットでは、Webhookという機能が用意されています。GoogleチャットのWebhookは着信Webhookと呼ばれ、外部からチャットメッセージを投稿できる仕組みです。このWebhookは無料版のGoogleチャットにはありません。

では、Webhook URLの取得方法をご説明します。

まず、社員全員に送信する場合は、社員全員が登録しているチャットスペースを選択します。選択したスペースの名前の右横にある逆三角をクリックすると下の図のようになります。

Webhook URLの取得方法①

その中の「Webhookを管理」を選択します。すると下の画面が出てきて、ボットの名前とアバターを指定することができます。アバターは指定しなくても構いません。

Webhook URLの取得方法②

今回は名前を「お知らせ」と指定しました。その後保存ボタンを押すと、下の図のようにURLが表示されます。こちらをコピーしてください。

Webhook URLの取得方法③

月末月初の営業日にメッセージを送る

月末の営業日を特定する方法は、過去に紹介した月の最終営業日にGASを実行するの記事に記載されていますので、そちらをご確認ください。

月初めの処理は下記のようになります。

function checkstartofweekday() {
 const gessi = new Date(today.getFullYear(), today.getMonth(), 1)
  //月初めの日を取得
  const d_gessi = gessi.getDate()
  //今日の日を取得
  const d_today = today.getDate()
  result = checkWeekday(gessi)
  if(result){
    //月初めが営業日=営業日
    if(d_gessi == d_today){
      //今日が最初の営業日 メッセージ配信
      let messageFlag = 2   //1:月末、2:月初め
      googlechatSend(messageFlag)
    }
  }else{
    //月初めは営業日ではない
    if(d_gessi < d_today){
      //今日が月初めではない
      for(let i = d_gessi; i <= d_today; i++) {
        let checkdate = new Date(today.getFullYear(), today.getMonth(), i)
        let result = checkWeekday(checkdate)
        if(result){
          //平日
          if(i == d_today){
            //今日が最初の営業日 メッセージ配信
            let messageFlag = 2   //1:月末、2:月初め
            googlechatSend(messageFlag)
          }
          break
        }
      }
    }
  }
}

月末の時と似ていますが、異なるところは月初めのDateオブジェクト取得方法と、 月初めが営業日ではない場合のメッセージを送る方法 になります。

月初めのDateオブジェクト取得方法は以下になります

const gessi = new Date(today.getFullYear(), today.getMonth(), 1)

月初めは今日の月の1日を指定すればいいので、今日の月を取得後、日の方を1日を示す「1」を指定しています。

では、月初めが営業日ではない場合のメッセージを送る方法を説明します。

      for(let i = d_gessi; i <= d_today; i++) {
        let checkdate = new Date(today.getFullYear(), today.getMonth(), i)
        let result = checkWeekday(checkdate)
        if(result){
          //平日
          if(i == d_today){
            //今日が最初の営業日 メッセージ配信
            let messageFlag = 2   //1:月末、2:月初め
            googlechatSend(messageFlag)
          }
          break
        }
      }

月末の時と同じに見えますが、for文の条件が異なります。

たとえば月初めが1日(土)で今日が3日(月)だとします。変数iに月初めの「1」と代入し、繰り返し条件をiが今日の「3」以下である場合に処理すると指定し、iは、一回処理するごとに+1されるようにfor条件を書いています。
3日が最初の営業日で、1日(土)、2日(日)、3日(月)だった場合、1、2、3と処理されて、iが3の時にメッセージが配信されます。

また、今回は月末、月初めでメッセージの文章が異なるため、フラグで区別します。メッセージを送る関数にフラグを渡し、フラグが1の時は月末のメッセージ、フラグが2の時は月初めのメッセージを送信するようにしています。

スレッド名を取得する

Googleチャットはスレッド型で、ボットでメッセージを送信する際にいちいち新しくスレッドを作成したら、スレッドが乱立してしまいます。それを避けるために同じスレッド内にメッセージを送信する必要があります。

メッセージを同じスレッドに送信したい場合、スレッド名を指定する必要があります。スレッド名を取得するには一度メッセージを送信したのち、返ってきたレスポンスの中身をログで表示させて取得します。

function threadnameget() {
  var url = 'ここにWebhook URLを記載する';
  var text = "thread name取得投稿";
  var payload = {
    "text" : text
    }
  var json = JSON.stringify(payload); 
  var options = {
    "method" : "POST",
    "contentType" : 'application/json; charset=utf-8',
    "payload" : json
  }

  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response);
}

上記の関数(threadnameget)を実行させるとログが表示されます。また、先ほど取得したWebhook URLは下記の変数urlに指定します。

var url = 'https://chat.googleapis.com/xxxxxxxxxxx'; 

処理の内容としてはメッセージを送信する関数とほぼ同じですが、下記のように最後にレスポンスの中身のログを表示しています。

Logger.log(response);

関数(threadnameget)を実行させ、表示されたログが下記になります。

{
  "name": "spaces/AAAAAAAAAAA/messages/aaaaa-aaaaa.aaaaa-aaaaa",
  "sender": {
    "name": "users/000000000000000000000",
    "displayName": "お知らせ",
    "avatarUrl": "",
    "email": "",
    "domainId": "",
    "type": "BOT",
    "isAnonymous": false
  },
  "text": "thread name確認投稿",
  "cards": [],
  "previewText": "",
  "annotations": [],
  "thread": {
    "name": "spaces/AAAAAAAAAAA/threads/aaaaa-aaaaa"
  },
  "space": {
    "name": "spaces/AAAAAAAAAAA",
    "type": "ROOM",
    "singleUserBotDm": false,
    "threaded": true,
    "displayName": "チャットスペースの名前",
    "legacyGroupChat": false
  },
  "fallbackText": "",
  "argumentText": "thread name確認投稿",
  "attachment": [],
  "createTime": "2021-12-06T00:58:11.001631Z",
  "lastUpdateTime": "2021-12-06T00:58:11.001631Z"
}

ログの中でスレッド名が記載されている個所は下記になります。

"thread": {
    "name": "spaces/AAAAAAAAAAA/threads/aaaaa-aaaaa"
  },

このスレッド名はメッセージを送付する際に使用します。

メッセージを同じスレッドに送信する

まずは下の図のように、ボットに送信させたいメッセージをスプレッドシートに記載します。<users/all>を付けることで、チャットスペース全員宛のメッセージであることを明示できます。

送信するメッセージ

次に下記の関数(googlechatSend)を作成します。

function googlechatSend(messageFlag) {
  const SHEET = SpreadsheetApp.getActiveSheet()
  const sheet_data  = SHEET.getDataRange().getValues()
//下のurlに先ほど取得したWebhook URLを指定する。
  var url = 'https://chat.googleapis.com/xxxxxxxxxxx'; 
//メッセージをスプレッドシートから取得
  if (messageFlag == 1){     //1:月末、2:月初め
    var text = sheet_data[1][1]
  }else{
    text = sheet_data[2][1]
  }

// 送信内容を生成
  var thread = "spaces/AAAAAAAAAAA/threads/aaaaa-aaaaa"  //先ほど取得したスレッド名を指定 
  var payload  = {
      'text'      : text,
      "thread": {
        "name": thread
      }
   };
   var options = {
      'method'      : 'post'                 ,
      'contentType' : 'application/json'     ,
      'payload'     : JSON.stringify(payload),
   };

// 送信を実行
  var result = UrlFetchApp.fetch(url, options);
}

最初にスプレットシートに記載した情報全てを取得します。その後、受け取ったフラグの値により、月末のメッセージか、月初めのメッセージかを指定して設定しています。

先ほど取得したスレッド名は下記のように設定します。スレッド名を設定せずに空欄で実行した場合は新しいスレッドにメッセージが送られてしまいます。

 var thread = "spaces/AAAAAAAAAAA/threads/aaaaa-aaaaa" 

今回は送信だけですのでログを取得する必要はありません。

トリガーを設定する

作成したGASを実行させるため、トリガーを設定いたします。

設定方法につきましては、過去にご紹介した月の最終営業日にGASを実行するをご確認ください。
実行された結果が以下のようになります。

送信したボットの例

同じスレッドにボットを送信するには、ひと手間かかりますがスレッドが乱立するのを防ぐことができ、見やすくなります。
以上がGoogleチャットにGASから月末月初の営業日にメッセージを送信するプログラムの紹介でした。

ソースコードのダウンロード

下記からソースコード全体をダウンロードしていただけます。