こんにちは、もりです!
クラウド会計ソフトfreeeのAPIを使って、freeeの操作を自動化するシリーズです。
1ヶ月って早いなぁ…気がつけば月末だ。また今月分の請求書を作らないと。
同じ取引先宛に毎月請求書を作成する場合、「先月分の請求書をコピーして日付だけ変える」という作業をしている方が多いのではないでしょうか。
1~2件ならともかく、量が多いとめんどうくさいですよね。
合計2回の連載記事で、先月分の請求書を一括コピーして、かつ、日付も変更できる「請求書一括作成ツール」を紹介します。
Contents
freee請求書一括作成ツールとは
「請求書の一括作成」は、下記の流れで行います。
- freeeに作成済みの請求書データをスプレッドシートに取得する【API使用】
- スプレッドシート上で「請求書の日付」を書き換える【手作業】
- スプレッドシートのデータをfreeeに送信して請求書を作成する【API使用】
「一括作成」といっても、一から新たに作るのではなく、作成済みの請求書を丸ごとコピーするのがポイントです。
図にするとこのようなイメージです。freeeからデータを取ってきて、その日付を書き換えて、freeeに送信します。
【動画】freee請求書一括作成ツール
操作イメージをご覧ください(1分25秒)※再生しても音は出ません
freeeに作成済みの請求書データをスプレッドシートに取得する
この記事では、全体の流れのなかで「freeeに作成済みの請求書データをスプレッドシートに取得する【API使用】」の部分を作ります。
- freeeに作成済みの請求書データをスプレッドシートに取得する【API使用】←今回はココを作る
- スプレッドシート上で「請求書の日付」を書き換える【手作業】
- スプレッドシートのデータをfreeeに送信して請求書を作成する【API使用】
【事前準備】スプレッドシートの準備
スプレッドシートに「請求書データの出力欄」と「パラメータ設定欄」を用意します。
パラメータは下記の4つを指定できるようにします。
- 事業所名
- 請求日(開始日):yyyy-mm-dd ※書式を「日付」にしておく
- 請求日(終了日):yyyy-mm-dd ※書式を「日付」にしておく
- ステータス:すべて / 発行済み
A列の「コピー」は、スプレッドシートの「挿入」タブ→「チェックボックス」で作成しています。
freeeAPIから取得した請求書データのなかで「どの行をコピーするか?」を指定するためのもので、次回の記事で使用します。
【事前準備】freeeAPI連携アプリの作成とGASの認証
この記事で紹介するスクリプトを動作させるには、freeeAPIの連携アプリの作成と認証が済んでいることを前提としています。
詳しくは下記記事をご覧ください。
また、上記記事の認証スクリプト(認証用の関数)を、GASのプロジェクト内に書いておく必要があります。
具体的には、「getService」関数と、その中で使われている「Client_ID」「Client_Secret」の値です。
取得(GET)と作成(POST)の共通処理
請求書の「取得」と「作成」で共通して使用する変数・関数です。GASのプロジェクト内に記述しておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
const sheetname = '請求書'; //シート名を設定 const companycell = 'L2'; //事業所名を設定するセル番地 const invoice_col = { copy: 1, id: 2, issue_date: 3, due_date: 4, booking_date: 5, end: 8, param: 12, } /** * 指定のURLにリクエストを送信してレスポンスを返す * * @param {string} アクセストークン * @param {string} リクエストURL * @return {object} freeeAPIのレスポンス */ function accessfreeeAPI_(accessToken,url) { Utilities.sleep(1000); //短時間の連続アクセスを回避するため待機 const params = { method : 'get', headers : {'Authorization':'Bearer ' + accessToken} }; const response = UrlFetchApp.fetch(url,params); const obj = JSON.parse(response); return obj; } /** * 事業所名から事業所IDを返す * * @param {string} 事業所名 * @return {string} 事業所ID */ function getCompanyId_(company_name) { const accessToken = getService().getAccessToken(); const requestUrl = 'https://api.freee.co.jp/api/1/companies'; let obj = accessfreeeAPI_(accessToken,requestUrl); obj = obj.companies; for (const i in obj) { if (obj[i].name === company_name) { return obj[i].id; } } } |
【スクリプト】請求書データの取得
下記スクリプトの「exportInvoices」関数を実行すると、条件に一致する請求書データをスプレッドシートに取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
//エントリポイント function exportInvoices() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname); //前回取得データのクリア sheet.getRange(2, 1, sheet.getLastRow(), invoice_col.end).clearContent(); const parameters = sheet.getRange(2, invoice_col.param, 4, 1).getValues(); const requestUrl = createRequestUrl_(parameters); const accessToken = getService().getAccessToken(); const obj = accessfreeeAPI_(accessToken,requestUrl); const objInvoice = obj.invoices; const ui = SpreadsheetApp.getUi(); if (objInvoice.length) { OutputInvoices_(sheet, objInvoice); ui.alert('取得結果', '請求書データを取得しました。\n\n' + 'コピーする請求書行のA列にチェックを入れて、\n' + '請求日, 期日, 売上計上日 を変更し、\n' + 'freeeメニューから【請求書作成】を実行してください', ui.ButtonSet.OK); } else { ui.alert('取得結果','対象データが存在しません',ui.ButtonSet.OK); } } /** * 指定のパラメータからリクエストURLを作成する * * @param {object} リクエストURLを作るためのパラメータ * @return {string} リクエストURL */ function createRequestUrl_(parameters) { const company_name = parameters[0][0]; const company_id = getCompanyId_(company_name); let issue_date_start = parameters[1][0]; let issue_date_end = parameters[2][0]; issue_date_start = Utilities.formatDate(issue_date_start,'JST','yyyy-MM-dd'); issue_date_end = Utilities.formatDate(issue_date_end,'JST','yyyy-MM-dd'); let status = parameters[3][0]; if (status === '発行済み') { status = '&invoice_status=issued'; } else { status = ''; } //テンプレートリテラルで記述 const url = `https://api.freee.co.jp/api/1/invoices?company_id=${company_id}&issue_date_start=${issue_date_start}&issue_date_end=${issue_date_end}${status}`; return url; } /** * 請求書データを指定のシートに出力する * * @param {object} 出力先シート * @param {object} 請求書データ */ function OutputInvoices_(sheet,obj) { let arr = []; for(let i = 0; i < obj.length; i++) { //請求書ID,請求日,期日,売上計上日,取引先名,概要,合計金額 let {id,issue_date,due_date,booking_date,partner_name,description,total_amount} = obj[i]; arr.push([id,issue_date,due_date,booking_date,partner_name,description,total_amount]); } sheet.getRange(2, invoice_col.id, arr.length, arr[0].length).setValues(arr); SpreadsheetApp.flush(); } |
【実行結果】
スクリプトの実行結果です。条件に一致する請求書データをスプレッドシートに取得できました。
次回は、スプレッドシートに取得したこのデータを使用して「請求書の作成」をします。