Posted at

GASでスプレッドシートの内容をSlackに投稿


目的

自分はTeamに所属していて会計をやっています。

スプレッドシートで会計の記録を管理してるんだけど一々支払いを呼びかけるの面倒臭いから自動でSlackに通知してしまおう。という目論見で開発。


GASとは?


  • Google Apps Scriptの略

  • Googleが提供するサービスをスクリプトで操作できる


Slackの設定


  • 「Manage team members」 → 「Home」 → 「Incoming WebHooks」 → 「Add Configuration」からWebhookを追加する。

  • チャンネル名の設定、WebhookURLの保管、アイコンの設定などを必要に応じて行う。


スプレッドシートの作成

スプレッドシートの中身は割愛するが、下図の該当箇所をSlackに送りたい。

名称未設定.png


GASの作成

「ツール」 → 「スクリプトエディタ」にてプロジェクト作成

作成したプロジェクトに以下を記載

//WebhookのURLとチャンネル名

var postUrl = 'hogehoge';
var postChannel = '#money';

//スプレッドシートのメッセージ取得
function getMessage(){
//スプレッドシートのURL
var spreadSheet = SpreadsheetApp.openByUrl('hogehoge');
//シートの番号
var sheet = spreadSheet.getSheets()[2];
//取得するシートの行列(28行目、1列目、5行分、2列分)
var messageArray = sheet.getRange(28, 1, 5, 2).getDisplayValues(); //2次元配列
var message = new Array();

//2次元配列を1次元配列に変換
for(var i = 0; i < messageArray.length; i++){
for(var j = 0; j < messageArray[i].length; j++){
message.push(messageArray[i][j]);
}
}
//配列を改行で連結
var sendMessage = message.join('\n');

return sendMessage;
}

//Main
function postToSlack(){
//('送信するメッセージ', '送信するユーザー名', '送信するユーザーのアイコン')
sendHttpPost(getMessage(), 'money', ':moneybag:');
}

function sendHttpPost(message, username, icon){
//チャンネル、ユーザー名、アイコン、メッセージ内容をJsonで設定
var jsonData = {
"channel" : postChannel,
"username" : username,
"icon_emoji" : icon,
"text" : message
};
var payload = JSON.stringify(jsonData);
//送信設定
var options = {
"method" : "post",
"contentType" : "application/json",
"payload" : payload
};
//POSTリクエスト
UrlFetchApp.fetch(postUrl, options);
}


動作テスト

postToSlack()を実行する

スクリーンショット 2019-01-21 23.20.05.png


トリガーの設定

Excel VBAとは異なり、トリガーを設定することで、サーバーで自動的に実行される。


  • 「編集」 → 「現在のプロジェクトのトリガー」 → 「トリガーを追加」にて様々な設定のトリガーが追加できる。

  • 今回は毎月23日に実行されるよう設定。


まとめ

面倒だった会計処理もGASのおかげで楽になった。