【GAS×freeeAPI】当日入金予定の取引一覧を毎日自動でチャットワークに送信する


こんにちは!ITライターのもり(@moripro3)です!

クラウド会計ソフトfreeeのAPIを使って経理業務を自動化するネタをシリーズでお届けしています。

このシリーズでは、freeeとチャットワークを連携して「当日入金予定の取引一覧を自動でチャットワークに送信するツール」を作成します。

成果物のイメージがこちら!入金予定のある日に、自動でチャットワークに通知が届きます。

freeeシリーズ2成果物イメージ

前回の記事では、スプレッドシートのデータからチャットワーク通知用の本文を作成しました。

【GAS×freeeAPI】スプレッドシートのデータからチャットワーク通知用の本文を作成する
「当日入金予定の取引一覧を自動でチャットワークに送信する」シリーズの第6回目。スプレッドシートの値を取得して文字列結合し、チャットワークに通知する本文を作成します。

今回の記事はいよいよ最終回です!チャットワークへの送信処理と、トリガーによるスクリプト自動実行の設定をしてツールを完成させますよ!

シリーズを通して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種類のタグを付与します。

  1. [title]タグ = メッセージのタイトル部を表す
  2. [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トークンの発行手続きは比較的簡単なので、こちらの記事を参照のうえ、発行してください。

【初心者向けGAS】Chatworkのマイチャットにメッセージを送る最も簡単な例
初心者向けGoogle Apps Scriptのシリーズとして、ChatworkのBotを作成する方法をお伝えしています。今回は、超簡単な例としてマイチャットにメッセージを送る方法と、APIトークンの取得の方法です。

ライブラリ「ChatWorkClient for Google Apps Script」を追加

「ChatWorkClient for Google Apps Script」というライブラリを使うと、チャットワークに簡単にメッセージを送信できます。

ライブラリのプロジェクトキーがこちらです。

プロジェクトキー: M6TcEyniCs1xb3sdXFF_FhI-MNonZQ_sT

ライブラリとは何か、ライブラリの追加方法についてはこちらの記事をご参照ください。

【初心者向けGAS】面倒なことはライブラリに任せよう!その概要と追加の方法
初心者向けGoogle Apps ScriptのシリーズとしてチャットワークのBotの作り方についてお伝えしています。今回はライブラリとは何か、またその追加の仕方についてお伝えしていきます。

送信先のルームIDを確認

チャットワークの送信先ルームを決めます。マイチャット・指定のグループいずれでも送信可能です。

チャットワークにはルーム(グループ)ごとに一意に割り当てられた「ルームID」が存在します。送信処理で「ルームID」が必要になるので、確認しましょう。

送信先ルームのURLの#!ridに続く数字が「ルームID」です。ここでは、当ブログの執筆チームグループに送信してみます。

チャットワークのルーム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トークンの所有者となります。

チャットワークAPIを使って送信

以上で、「当日入金予定の取引一覧をチャットワークに通知する」スクリプトの完成です。(スクリプトのまとめは最後に掲載します)

GASのトリガーを設定する

スクリプトを日次で自動実行するためにトリガーを設定します。

スクリプトエディタ上部の時計マーク「現在のプロジェクトのトリガー」を選択します。

現在のプロジェクトのトリガー

「+トリガーを追加」をクリックします。

トリガーを追加

赤枠の項目を設定します。「実行する関数を選択」は、関数mainです。送信時刻はお好みで指定しましょう。

トリガーの設定

これで、毎日午前6時~7時の間に自動でスクリプトが実行されます。条件に合致する取引が存在する日のみ、チャットワークに通知が届きます。

【まとめ】当日入金予定の取引一覧をチャットワークに送信するスクリプト

シリーズ2で作成した全スクリプトを掲載します。

※このスクリプトを動作させるためには、下記3つの条件が必要です。

  1. シリーズ1の記事「【はじめてのfreeeAPI】GASとfreeeつなぐ!連携認証の手順を一から紹介します」でfreeeAPIの認証を済ませていること
  2. 上記記事内の、freeeAPIのサービスを取得する関数「getService」が同一プロジェクト内に存在すること。また、Client_IDとClient_Secretに各自の値を設定していること
  3. 下記スクリプトの3つの変数に値を設定していること
    1. getDeals関数の「company_id」(事業所ID)
    2. postChatwork関数の「token」(チャットワークAPIトークン)
    3. 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で操作して経理業務を自動化するシリーズ。「当日入金予定の取引一覧を自動でチャットワークに送信するツール」の作成を目標とします。

  1. ノンプログラミングでOK!「会計freee連携アドオン」でスプレッドシートにデータを取得する
  2. 【GAS×freeeAPI】指定条件の取引一覧を取得する「リクエストURL」の作り方と仕組み
  3. 【GAS×freeeAPI】GETリクエストで当日入金予定の取引一覧を取得する
  4. 【GAS×freeeAPI】APIリクエストのレスポンスから必要データのみを取り出す
  5. 【GAS×freeeAPI】オブジェクトからデータを取り出してスプレッドシートに書き出す
  6. 【GAS×freeeAPI】スプレッドシートのデータからチャットワーク通知用の本文を作成する
  7. 【GAS×freeeAPI】当日入金予定の取引一覧を毎日自動でチャットワークに送信する

  投稿者プロフィール

もり
もりITライター
GoogleAppsScript, VBAを専門とするITライターです。

退屈なことはプログラミングで片づけよう!
自らの事務職経験を活かし、事務作業をとことんラクにできるITネタを発信していきます。

個人ブログ『もりさんのプログラミング手帳』も運営中!

お気軽にTwitterフォローしてくださいね!

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