こんにちは!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】当日入金予定の取引一覧を毎日自動でチャットワークに送信する