こんにちは、もりです!
クラウド会計ソフトfreeeのAPIを使って、freeeの操作を自動化するシリーズ。合計2回の連載で「振替伝票の逆仕訳を一括作成するツール」を作ります。
今回は、指定条件の振替伝票を一括取得してスプレッドシートに出力するスクリプトを紹介します。
※この記事で紹介するスクリプトを動作させるには、freeeAPIの連携アプリの作成と認証が済んでいることを前提としています。
詳しくは下記記事をご覧ください。
逆仕訳一括作成ツール
逆仕訳(反対仕訳)とは、貸借を逆に起票する仕訳です。伝票仕訳を間違えた時の訂正や、決算整理仕訳の戻入で作りますね。
【動画】ツールの使い方(処理の流れ)
freeeの振替伝票を使用した「逆仕訳」の作成は、下記の流れで行います。
- freeeに登録済みの振替伝票をスプレッドシートに出力する【API使用】
- スプレッドシート上で日付を書き換える【手作業】
- スプレッドシートのデータを貸借入替でfreeeに登録する【API使用】
詳細は操作デモをご覧ください。※再生すると解説の音声が出るのでご注意ください!
freeeに登録済みの振替伝票をスプレッドシートに出力する
この記事では、全体の流れのなかで「freeeに登録済みの振替伝票をスプレッドシートに出力する【API使用】」の部分を作ります。
- freeeに登録済みの振替伝票をスプレッドシートに出力する【API使用】←今回はココを作る
- スプレッドシート上で日付などを書き換える【手作業】
- スプレッドシートのデータを貸借入替でfreeeに登録する【API使用】
【事前準備】スプレッドシートの準備
スプレッドシートに「取得項目」と「パラメータ」を設定する枠を用意します。セルの色は下記の意味をもっています。
- 黄色セル → パラメータを設定(入力)するセル
- 水色セル → 取得結果を出力するセル
下記図の①~③の説明です。
- ①振替伝票作成のPOST処理で使用するkey
- ②取得項目の日本語名
- ③パラメータ設定欄(「仕訳の種類」欄はデータの入力規則で作成)
【スクリプト】
このスクリプトと同じプロジェクト内に、下記記事の認証スクリプト(認証用の関数)を書いておく必要があります。
【freee×GAS】GoogleAppsScriptでfreeeAPIと連携認証する(サンプルコードあり)
具体的には、「getService」関数と、その中で使われている「Client_ID」「Client_Secret」の値です。
そして、下記スクリプトの「getJournalMain」関数を実行すると、条件に一致する振替伝票をスプレッドシートに取得できます。
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
//エントリポイント function getJournalMain() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('振替伝票'); const START_ROW = 3; const END_COL = 10; //J列 const PARAM_COL = 13; //M列 //前回データのクリア sheet.getRange(START_ROW, 1, sheet.getLastRow(), END_COL).clearContent(); //パラメータ・アクセストークンの取得 const parameters = sheet.getRange(1, PARAM_COL, 11, 1).getValues(); const accessToken = getService().getAccessToken(); //振替伝票一覧を取得 const resJounals = getManualJournals_(accessToken,parameters); const objJounals = JSON.parse(resJounals).manual_journals; if (objJounals.length > 0) { //勘定科目一覧を取得(勘定科目IDを勘定科目名に変換するため) const resItems = getAccountItems_(accessToken,parameters); const objItems = JSON.parse(resItems).account_items; //スプレッドシートに出力 OutputManualJournals_(sheet,objJounals,objItems,START_ROW); } } /* * freeeAPIで振替伝票一覧を取得する * /api/1/manual_journals * * @param {Object} パラメータ * @return {Object} freeeAPIからのレスポンス */ function getManualJournals_(accessToken,parameters) { const company_id = parameters[1][0]; //事業所ID let start_issue_date = parameters[4][0]; //伝票日付(開始日) let end_issue_date = parameters[5][0]; //伝票日付(終了日) let adjustmentType = parameters[6][0]; //仕訳の種類 start_issue_date = Utilities.formatDate(start_issue_date, 'JST', 'yyyy-MM-dd'); end_issue_date = Utilities.formatDate(end_issue_date, 'JST', 'yyyy-MM-dd'); let adjustment = ''; if (adjustmentType === '決算整理仕訳') { adjustment = '&adjustment=only'; } else if (adjustmentType === '日常仕訳') { adjustment = '&adjustment=without'; } const requestUrl = 'https://api.freee.co.jp/api/1/manual_journals?' + 'company_id=' + company_id + '&start_issue_date=' + start_issue_date + '&end_issue_date=' + end_issue_date + adjustment; const params = { method : 'get', headers : {'Authorization':'Bearer ' + accessToken} }; const response = UrlFetchApp.fetch(requestUrl,params); return response; } /* * freeeAPIから勘定科目一覧を取得する * /api/1/account_items * * @param {string} 事業所ID * @return {Object} freeeAPIからのレスポンス */ function getAccountItems_(accessToken,parameters) { const company_id = parameters[1][0]; //事業所ID const requestUrl = 'https://api.freee.co.jp/api/1/account_items?' + 'company_id=' + company_id; const params = { method : 'get', headers : {'Authorization':'Bearer ' + accessToken} }; const response = UrlFetchApp.fetch(requestUrl,params); return response; } /* * 振替伝票のデータをスプレッドシートに書き出す * * @param {Object} シート * @param {Object} 振替伝票データ * @param {Object} 勘定科目データ * @param {Number} 書き込み開始行 */ function OutputManualJournals_(sheet,obj,objItems,row) { let arr = []; for(let i = 0; i < obj.length; i++){ for(let j = 0; j < obj[i].details.length; j++) { let val1 = obj[i].id; //振替伝票ID let val2 = obj[i].issue_date; //発生日 let val3 = obj[i].adjustment; //決算整理仕訳(falseまたは未指定の場合: 日常仕訳) let val4 = obj[i].details[j].entry_side; //貸借(貸方credit, 借方debit) let val5 = obj[i].details[j].account_item_id; //勘定科目ID let val6 = fromAccountItemIdToName_(objItems,val5);//勘定科目ID→勘定科目名 let val7 = obj[i].details[j].tax_code; //税区分 let val8 = obj[i].details[j].amount; //金額(税込) let val9 = obj[i].details[j].vat; //消費税 let val10 = obj[i].details[j].description; //備考 arr.push([val1,val2,val3,val4,val5,val6,val7,val8,val9,val10]); } } //配列をスプレッドシートに書き出す sheet.getRange(row, 1, arr.length, arr[0].length).setValues(arr); } /* * 勘定科目IDから勘定科目名を返す * * @param {Object} 勘定科目一覧 * @param {string} 勘定科目ID * @return {string} 勘定科目名 */ function fromAccountItemIdToName_(objItems,account_item_id) { let account_item_name = ''; for(let i = 0; i < objItems.length; i++){ if (objItems[i].id == account_item_id) { account_item_name = objItems[i].name; break; } } return account_item_name; } |
【実行結果】
スクリプトの実行結果です。スプレッドシートに振替伝票のデータを取得できました。
・freeeの画面(3件)
・スプレッドシート出力結果(3件)
次回は、スプレッドシートに出力したデータを使用して「貸借逆の振替伝票」を作成します。