GASでつくるChatwork予約投稿(スケジュール投稿)機能

働き方改革

GASを使い、Chatwork(チャットワーク)でほぼ時刻どおりに予約した投稿を送信できる機能をつくりました。

※2019/02/10更新
送信したユーザにも通知が届くよう修正しました(メッセージ送信に self_unread 追加)

使い方

スプレッドシートで①日時と②ルームIDと③投稿するメッセージを指定すれば、ほぼ時刻どおりに予約した投稿を送信できます。

メッセージは改行もOK

GASのトリガ機能を利用し、トリガ実行時点で時刻を過ぎているものを自動で投稿します。指定した時刻どおりではなく、トリガが実行された時刻に投稿されるので、「ほぼ」時刻どおりという表現になっています。

日時は「yyyy/mm/dd hh:mm:ss」という形式で時刻までしっかり指定してください。

ちなみに、「ルームID」というのは、チャットワークのURLにある末尾の数字です。
これをコピペして使用してください。

作り方

1.Googleドライブでスプレッドシートを作成します。

2.上部のメニューから、ツール > スクリプトエディタを開きます。

3.このページの下部にあるGASのコード(全部で90行くらい)をコピペします。

4.コード上の方にあるチャットワークAPIトークンにご自分のトークンを入力して保存します。
(チャットワークAPIトークンの取得方法はこちら。)

5. myFunction を一度実行し、諸々の実行許可をしておきます。

6. トリガを設定します。10分おきくらいがおすすめです。

あとは、スプレッドシートに戻って①日時と②ルームIDと③投稿内容を指定しておくと、定期的なトリガ実行時に予定時刻を過ぎたものが自動で投稿されます。

注意点など

ちなみに、暴走を防ぐため、日付が昨日よりも古い場合は投稿しないようになっています。

投稿済みか否かはD列(投稿日時)に値が入っているかで確認していますので、ここを空欄にすると再び投稿する対象になります。

GASのコード

以下がスクリプトエディタにコピペするコードです。
チャットワークAPIトークンの書き換えをお忘れなく。

/*---- 初期設定ここから ----*/

// チャットワークAPIトークンを設定
var ChatWorkToken = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
// 設定用シートのシート名
var SHEETNAME = 'シート1';

/*---- 初期設定ここまで ----*/

// 管理用メニューを追加
function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('管理用')
      .addItem('いますぐ実行', 'myFunction')
      .addToUi();
}

// 予約投稿のメインのファンクション
function myFunction(){
  // スプレッドシート読込->json取得
  var sheet = getSheet();
  var json = convertSheet2Json(sheet);
  // シート書き出し配列を定義
  var values = [];
  // 現在の日時取得
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
  // シートをクリア
  sheet.clearContents();
  
  // 1行目はフィールド名を挿入
  values[0] = [ '日時', 'ルームID', 'メッセージ', '投稿日時' ];
  // jsonの内容を2行目以降に追加
  for each(var obj in json){  
    // メッセージ送信
    if( obj.msg && obj.room_id && obj.sent_date == "" && obj.estimated_date > yesterday && obj.estimated_date < now ){
      sendMessage( obj.room_id, obj.msg );
      obj.sent_date = now;
    }
    var line = [ obj.estimated_date, obj.room_id, obj.msg, obj.sent_date ];
    values.push( line );
  }
  // シートに貼付け
  sheet.getRange(1,1,values.length,values[0].length).setValues( values );
}

function getSheet(){
  var book = SpreadsheetApp.getActiveSpreadsheet();
  return book.getSheetByName(SHEETNAME);
}

// シートを読み込んでjson形式で返す
function convertSheet2Json(sheet) {
  // シートを読み込んで二次元配列を返す
  var values = readSheet(sheet);
  if( values == false ) return false;
  // create json
  var jsonArray = [];
  for(var i=0; i<values.length; i++) {
    var json = new Object();
    json['estimated_date'] = values[i][0];
    json['room_id'] = values[i][1];
    json['msg'] = values[i][2];
    json['sent_date'] = values[i][3];
    jsonArray.push(json);
  }
  return jsonArray;
}

// シートを読み込んで二次元配列を返す
function readSheet(sheet){
  var lastRow = sheet.getLastRow();
  if( lastRow <= 1 ) return false;
  var rowIndex = 2;
  var colStartIndex = 1;
  var colNum = 4;
  var range = sheet.getRange(rowIndex, colStartIndex, lastRow, colNum);
  var values = range.getValues();
  return values;
}

// メッセージ送信
function sendMessage(room_id, strBody){
  var params = {
    headers : {"X-ChatWorkToken" : ChatWorkToken},
      method : "post",
      payload : {
        body : strBody,
        self_unread : "1"
      }
  };
  var url = "https://api.chatwork.com/v2/rooms/" + room_id + "/messages";
  UrlFetchApp.fetch(url, params);
}

まとめ

今回はスプレッドシートを使ってチャットワークに予約投稿する機能でした。

お手伝いしている会社さんでは、kintoneで投稿内容を管理して、あらかじめ設定した複数のグループチャットに同時に予約投稿する、ということも実現しています。

よりパワーアップした機能を実装したい方はお問い合わせフォームからご相談ください。

コメント

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