LoginSignup
0
2

More than 3 years have passed since last update.

【Chatwork】スプレッドシートから指定時刻にメッセージを送信する

Last updated at Posted at 2021-02-26

はじめに

社内でチャットワークの利用者が増え、窓もたくさん増えてきたことにより、
チャットで定期報告や、会議のリマインドなどを促すBOTが欲しいと思いました。

image.png

前提

  • チャットワークAPIが使用可能であること。
  • BOTメッセージ送信者のアカウントを、BOTを利用したい窓に招待すること。
    • (できれば)BOT専用アカウントがあること。
    • リマインドのBOTなので、普段使用者のアカウントを利用してしまうと、その人には通知が届かない為、専用のBOTアカウントを作成することが好ましいです。

画面と仕組み

利用者はスプレッドシートにアクセスし、送信内容予約時刻を入力します。
image.png

下記に記載のプログラムを走らせることにより、
現在時刻が予約時刻過ぎれば、チャットが送信される仕組みになっています。
また、ログの時刻と予約時刻が同一なら、送信しないようになっています。

これを、トリガーなどで回せば、自動で送信できるシステムの完成です。

image.png

コード

// シートを参照し、チャットを送信する
function chatwork_bot() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('シート1');
  var values = sheet.getRange("A2:C").getValues()

  var COL_MSG = 0 //A列
  var COL_TIME = 1 //B列
  var COL_LOG = 2 //C列

  for (var i=0; i<values.length; i++){
    var message = values[i][COL_MSG]
    var now_time = new Date()
    var send_time = values[i][COL_TIME]
    var log_time = values[i][COL_LOG]

    // メッセージが空白ならcontinue
    if (message == ""){
      continue
    }
    // 送信日時が空白ならcontinue
    if (send_time == ""){
      continue
    }

    // 日時が送信済み or 未達 or 時刻判定不可ならcontinue
    try{
      if (log_time != ""){
        if (send_time.getTime() == log_time.getTime()){
          continue
        }
      }
      if (send_time.getTime() > now_time.getTime()){
        continue
      }
    }catch(e){
      continue
    }

    // 送信
    sendMessage(
      'abcdef1234567890',
      0123456789,
      message,
    );
    sheet.getRange(i + 2, COL_LOG + 1).setValue(send_time)
  }
  return
}

// 引数より、発言者(BOT)、部屋、メッセージ内容が指定できる
function sendMessage(token,room_id,body){
  var params = {
    headers : {"X-ChatWorkToken" : token},
    method : "post",
    payload : {
      body : body
    }
  };
  var url = "https://api.chatwork.com/v2/rooms/" + room_id + "/messages";
  try{
    UrlFetchApp.fetch(url, params);
    return true;
  }catch(e){
    return false;
  }
}

懸念点

  • 利用者にトークンIDが見えてしまう
  • 利用者で共通のシートを利用することになる

これらの問題があります。トークンIDが見えないようにするには、
別シートにimportし、プログラムを走らせることで回避できます。

さいごに

コードが長くなるので、要所のみを抑えたプログラムとなりますが、
today関数などを利用すれば、毎日送信することも可能ですし、
月初や月末、祝日など設定することも可能です。

ぜひ用途に合わせて使いやすい形に組み替えてみてください。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2