こんにちは!ITライターのもり(@moripro3)です!
クラウド会計ソフトfreeeのAPIを使って経理業務を自動化するネタをシリーズでお届けしています。
このシリーズでは、freeeとチャットワークを連携して「当日入金予定の取引一覧を自動でチャットワークに送信するツール」を作成します。
成果物のイメージがこちら!入金予定のある日に、自動でチャットワークに通知が届きます。
前回の記事では、スプレッドシートのデータからチャットワーク通知用の本文を作成しました。

今回の記事はいよいよ最終回です!チャットワークへの送信処理と、トリガーによるスクリプト自動実行の設定をしてツールを完成させますよ!
シリーズを通してfreeeAPIを使いこなし、経理業務の自動化を進めていきましょう!
(この記事はfreee株式会社さまとのコラボ企画です。シリーズを通して、皆さんの働くの価値を上げられるようサポートしていきます!)
(前回のおさらい)チャットワーク通知用の本文をログ出力
前回の記事では、スプレッドシートに書き出した取引データの「ID」の項目を、マスタとVLOOKUP関数で「名称」に変換しました。
そして、赤枠の5項目からチャットワーク通知用の本文を作る関数createBodyで、ログ出力するところまでを確認しました。
/**
* スプレッドシートのデータからチャットワーク送信用の本文を作成する
*
* @param {number} 取引件数
*/
function createBody(total_count) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('取引');
var values = sheet.getRange(2, 1, total_count, 9).getValues();//A列~I列の値を格納
var issue_date,amount,partner,account_item,item;
var body = '';
for (var i = 0; i < values.length; i++) {
//二次元配列の値を変数に格納
issue_date = values[i][0]; //発生日
amount = values[i][2]; //金額
partner = values[i][6]; //取引先
account_item = values[i][7]; //勘定科目
item = values[i][8]; //品目
//パイプライン(|)で結合する
body += issue_date + ' | ' + partner + ' | ' + amount + ' | ' + account_item + ' | ' + item + '\n';
}
//ヘッダー項目を付与
var header = '[発生日] | [取引先] | [金額] | [勘定科目] | [品目等]\n';
body = header + body;
Logger.log(body);
}
ログ出力結果です。
あとはこれをチャットワークに送信するのですが、その前に少し装飾を加えていきます。
本文にメッセージ記法のタグを付ける
チャットワークには、メッセージやタスクの情報を装飾して見やすくするための「メッセージ記法」が存在します。
メッセージ記法の詳細はこちらのチャットワークAPIドキュメントをご覧ください。
これまで作成した文字列に対して、チャットワークのメッセージ記法のタグを付けていきます。
このツールでは2種類のタグを付与します。
- [title]タグ = メッセージのタイトル部を表す
- [info]タグ = メッセージ全体が特別な情報であることを表す
※タイトルの文字列は、「【会計freee】YYYY-MM-DDの入金予定(未入金のみ)」とします。
関数createBodyに処理を加えます。タイトルの文字列を作成して[title]タグで囲み、さらに、titleとbody全体を[info]タグで囲みます。
//タイトルとtitleタグを付与 var date = Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd'); //当日日付 var title = '[title]【会計freee】' + date + 'の入金予定(未入金のみ)[/title]'; //全体をinfoタグで囲む body = '[info]' + title + body + '[/info]'; Logger.log(body); /* [info][title]【会計freee】2019-08-15の入金予定(未入金のみ)[/title][発生日] | [取引先] | [金額] | [勘定科目] | [品目等] 2019-07-01 | テスト会社5 | 86400 | 売上高 | ポスターデザイン 2019-06-15 | テスト会社4 | 54000 | 売上高 | サービス料収入 2019-06-01 | テスト会社3 | 108000 | 売上高 | デザイン素材 [/info] */
できました!あとは、変数bodyをチャットワークに送信すれば完成です!
取引データをチャットワークに送信する
この項では、GASでチャットワークにメッセージを送信するスクリプトを書いていきます。
チャットワークAPIトークンの取得
GASでチャットワークを操作するために、チャットワークAPIを使用します。
まずは「チャットワークのAPIトークン」を取得します。チャットワークAPIトークンの発行手続きは比較的簡単なので、こちらの記事を参照のうえ、発行してください。

ライブラリ「ChatWorkClient for Google Apps Script」を追加
「ChatWorkClient for Google Apps Script」というライブラリを使うと、チャットワークに簡単にメッセージを送信できます。
ライブラリのプロジェクトキーがこちらです。
ライブラリとは何か、ライブラリの追加方法についてはこちらの記事をご参照ください。

送信先のルームIDを確認
チャットワークの送信先ルームを決めます。マイチャット・指定のグループいずれでも送信可能です。
チャットワークにはルーム(グループ)ごとに一意に割り当てられた「ルームID」が存在します。送信処理で「ルームID」が必要になるので、確認しましょう。
送信先ルームのURLの#!ridに続く数字が「ルームID」です。ここでは、当ブログの執筆チームグループに送信してみます。
これでチャットワーク送信の準備が整いました!
チャットワークに送信するスクリプト
引数として受け取った文字列を、チャットワークの指定のルームIDに送信するスクリプトです。
※token, room_id は各自の情報を指定してください。
/**
* チャットワークの指定のルームIDにメッセージを送信する
* プロジェクトキー : M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT
*
* @param {String} 送信するメッセージ
*/
function postChatwork(body) {
var client = ChatWorkClient.factory({token : 'xxxxxxxxxxxxxxx'}); //APIトークンを指定
client.sendMessage({
room_id : 'xxxxxxxx', //ルームIDを指定
body : body
});
}
関数postChatworkに文字列を渡して実行すれば、チャットワークに送信できます。「送信者」はAPIトークンの所有者となります。
以上で、「当日入金予定の取引一覧をチャットワークに通知する」スクリプトの完成です。(スクリプトのまとめは最後に掲載します)
GASのトリガーを設定する
スクリプトを日次で自動実行するためにトリガーを設定します。
スクリプトエディタ上部の時計マーク「現在のプロジェクトのトリガー」を選択します。
「+トリガーを追加」をクリックします。
赤枠の項目を設定します。「実行する関数を選択」は、関数mainです。送信時刻はお好みで指定しましょう。
これで、毎日午前6時~7時の間に自動でスクリプトが実行されます。条件に合致する取引が存在する日のみ、チャットワークに通知が届きます。
【まとめ】当日入金予定の取引一覧をチャットワークに送信するスクリプト
シリーズ2で作成した全スクリプトを掲載します。
※このスクリプトを動作させるためには、下記3つの条件が必要です。
- シリーズ1の記事「【はじめてのfreeeAPI】GASとfreeeつなぐ!連携認証の手順を一から紹介します」でfreeeAPIの認証を済ませていること
- 上記記事内の、freeeAPIのサービスを取得する関数「getService」が同一プロジェクト内に存在すること。また、Client_IDとClient_Secretに各自の値を設定していること
- 下記スクリプトの3つの変数に値を設定していること
- getDeals関数の「company_id」(事業所ID)
- postChatwork関数の「token」(チャットワークAPIトークン)
- postChatwork関数の「room_id」(チャットワークの送信先ルーム)

不明点や上手く動かないなどありましたら、私もり(@moripro3)にお気軽にお問い合わせください!TwitterのDMで承っております!
※当記事のコメント欄でももちろんOKです!
function main() {
//当日入金予定の取引一覧を取得する
var response = getDeals();
//JSON形式の文字列をオブジェクトに変換する
var obj = JSON.parse(response);
//取引件数の確認
var total_count = obj.meta.total_count;
//取引データが存在する場合のみ、後続の処理を行う
if (total_count > 0) {
//取引データをスプレッドシートに書き込む
OutputDeals(obj.deals);
//チャットワーク通知用の本文を作成する
var body = createBody(total_count);
//チャットワークに送信する
postChatwork(body);
}
}
/**
* freeeAPIにGETリクエストを送信して取引一覧を取得する
*
* @return {object} freeeAPIからのレスポンス
*/
function getDeals() {
var accessToken = getService().getAccessToken();
var company_id = 'xxxxxxx'; //事業所ID
var date = new Date(); //現在日時
date = Utilities.formatDate(date, 'JST', 'yyyy-MM-dd'); //表示形式を変換
//リクエストURL
var requestUrl = 'https://api.freee.co.jp/api/1/deals?' +
'company_id=' + company_id +
'&status=unsettled' +
'&type=income' +
'&start_due_date=' + date +
'&end_due_date=' + date +
'&limit=100';
//リクエスト送信時に付与するオプションパラメータ
var params = {
"method" : "get",
"headers" : {"Authorization":"Bearer " + accessToken}
};
var response = UrlFetchApp.fetch(requestUrl,params);
return response;
}
/**
* freeeAPIから取得したデータをスプレッドシートに書き出す
*
* @param {object} 取引データ
*/
function OutputDeals(objDeals) {
//前回データのクリア
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('取引');
var lastRow = sheet.getLastRow();
sheet.getRange(2, 1, lastRow, 6).clearContent();//A列~F列の2行目以降をクリアする
var arr = []; //空の配列を用意
for(var i = 0; i < objDeals.length; i++) {
var value1 = objDeals[i].issue_date; //発生日
var value2 = objDeals[i].due_date; //支払期日
var value3 = objDeals[i].amount; //金額
var value4 = objDeals[i].partner_id; //取引先ID
var value5 = objDeals[i].details[0].account_item_id; //勘定科目ID ※明細行1番目
var value6 = objDeals[i].details[0].item_id; //品目ID ※明細行1番目
//二次元配列を作成
arr.push([value1,value2,value3,value4,value5,value6]);
}
//二次元配列をスプレッドシートに書き出す
var i = arr.length; //タテ
var j = arr[0].length; //ヨコ
//スプレッドシートのA2セルを起点として、配列arrをセットする
sheet.getRange(2, 1, i, j).setValues(arr);
}
/**
* スプレッドシートのデータからチャットワーク送信用の本文を作成する
*
* @param {number} 取引件数
*/
function createBody(total_count) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('取引');
var values = sheet.getRange(2, 1, total_count, 9).getValues();//A列~I列の値を格納
var issue_date,amount,partner,account_item,item;
var body = '';
for (var i = 0; i < values.length; i++) {
//二次元配列の値を変数に格納
issue_date = values[i][0]; //発生日
amount = values[i][2]; //金額
partner = values[i][6]; //取引先
account_item = values[i][7]; //勘定科目
item = values[i][8]; //品目
//パイプライン(|)で結合する
body += issue_date + ' | ' + partner + ' | ' + amount + ' | ' + account_item + ' | ' + item + '\n';
}
//ヘッダー項目を付与
var header = '[発生日] | [取引先] | [金額] | [勘定科目] | [品目等]\n';
body = header + body;
//タイトルとtitleタグを付与
var date = Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd'); //当日日付
var title = '[title]【会計freee】' + date + 'の入金予定(未入金のみ)[/title]';
//全体をinfoタグで囲む
body = '[info]' + title + body + '[/info]';
return body;
}
/**
* チャットワークの指定のルームIDにメッセージを送信する
* 参照ライブラリ : M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT
*
* @param {String} 送信するメッセージ
*/
function postChatwork(body) {
var client = ChatWorkClient.factory({token : 'xxxxxxxxxx'}); //APIトークンを指定
client.sendMessage({
room_id : 'xxxxxxxx', //ルームIDを指定
body : body
});
}
「当日入金予定の取引一覧を自動でチャットワークに送信する」シリーズの第7回目(最終回)では、チャットワークにメッセージを送信する処理を作成してツールを完成させました。また、これらの処理を紹介しました。
- チャットワークのメッセージを装飾する「メッセージ記法」の使い方
- GASからチャットワークにメッセージを送信するライブラリ「ChatWorkClient for Google Apps Script」の使い方
- GASで指定の日時にスクリプトを自動実行するトリガーの設定方法
シリーズ2は以上です!お読みいただきありがとうございました。
連載目次:【GAS×freeeAPI】当日入金予定の取引一覧を自動でチャットワークに送信する
「クラウド会計ソフトfreee」のAPIをGASで操作して経理業務を自動化するシリーズ。「当日入金予定の取引一覧を自動でチャットワークに送信するツール」の作成を目標とします。
- ノンプログラミングでOK!「会計freee連携アドオン」でスプレッドシートにデータを取得する
- 【GAS×freeeAPI】指定条件の取引一覧を取得する「リクエストURL」の作り方と仕組み
- 【GAS×freeeAPI】GETリクエストで当日入金予定の取引一覧を取得する
- 【GAS×freeeAPI】APIリクエストのレスポンスから必要データのみを取り出す
- 【GAS×freeeAPI】オブジェクトからデータを取り出してスプレッドシートに書き出す
- 【GAS×freeeAPI】スプレッドシートのデータからチャットワーク通知用の本文を作成する
- 【GAS×freeeAPI】当日入金予定の取引一覧を毎日自動でチャットワークに送信する











