取引先別の売掛金(取引先コード順)の試算表を作ってみた〜会計ソフトfreeeのAPI連携〜

はじめに

クラウド会計ソフトfreee(以下、freee)の試算表は、売掛金を取引先別で表示すると取引残高順で表示され、画面上では表示順を変更することはできません。しかし、「取引先コード順に試算表を確認したい」という方もいらっしゃるのではないでしょうか。

そこで、freeeAPIを活用してスプレッドシートに取引先コード順の取引先別の売掛金残高を出力・確認する方法を記事にしました。

なお、本記事では取引先別の売掛金(取引先コード順)の試算表の作り方ですが、例えば、売掛金を買掛金に置き換えるなどのカスタマイズは可能です。

対象読者

・freeeのユーザー

・freeeのAPI機能の仕組みを理解しているユーザー

・Google(スプレッドシート)のユーザー

・Google Apps Scriptを読み書き可能なユーザー

・経営者や財務、経理、経営管理などの管理職や担当者、会計・税理士事務所の関係者

を対象読者と想定して執筆しています。

この記事を読んでできるようになること

・freeeから取引先情報(取引先や取引先コード)を取得すること(パラーメーターの指定)

・freeeから期間指定した試算表(取引先別の売掛金)を取得すること(パラーメーターの指定)

・取得した取引先情報と試算表を連結させ、取引先コードを表示する試算表と作り変えること(データの加工)

・連結した取得情報をスプレッドシートに指定したシート、セルに出力し、並び替え、罫線などの必要な装飾を加えること(データの出力と表現)

実装方針

・プログラミング知識のないユーザーが操作でき、簡単に最新情報に更新できること

前提

・freeeのユーザーアカウント(権限は「取引先登録」以外)を保持しており、Googleアカウントでログインできる状態であること

・最新データはfreee上に登録してあること

・freeeのAPI認証済みであること。*なお、本記事でのAPI認証方法はこちらの記事のサンプルを参考に実施しており、その方法は割愛しています。

・freeeの取引先設定で取引先コードを登録してあること

・freeeに登録済みの取引先数が500以下であること。*500を超える場合も対応可能ですが、一部、コードの書き換えが必要です。

・スプレッドシートに表示させるのは、取引先別の売掛金データとして、取引先コード、取引先名、期首残高、期中借方金額、期中貸方金額、期末残高を表示すること

目標成果物

取引先コード順に取引先別の売掛金の試算表を表示させる。

流れ

スプレッドシートの作成〜設定

スプレッドシートを新規作成

スプレッドシートを新規で作成します。*次のURLをクリックすると簡単に作成することができます。spreadsheet.new

「売掛金残高」「日付」の名称でシートを作成する

・売掛金残高

・日付

という名称のシートを作成します。

Google Apps Scriptでコードを記述

スクリプトを表示

スプレッドシート => ツール => スクリプト を選択

メインコード(Google Apps Script)

function getAccountReceivavle() {
//スプレッドシートの設定
var ss = SpreadsheetApp.openById("*********************************"); //スプレッドシートを指定する***にはスプレッドシートIDを入力してください
var date_sheet = ss.getSheetByName('日付'); //スプレッドシートのシートを指定する
var start_date = date_sheet.getRange('A2').getDisplayValue(); //期首の日付を指定する
var end_date = date_sheet.getRange('B2').getDisplayValue(); //期末の日付を指定する
var sheet = ss.getSheetByName("売掛金残高"); //売掛金情報を出力したいシートを指定する
//合鍵を制作する
var freeeApp = getService(); //freeeのAPI認証
var accessToken = freeeApp.getAccessToken();
//パラメーターを指定する ***にはcompany_idが入ります
var requestUrlBs =
"https://api.freee.co.jp/api/1/reports/trial_bs?company_id=**********&breakdown_display_type=partner" + '&end_date=' + end_date + '&start_date=' + start_date; //期間指定した取引先別のBS情報を取得するパラメーター
var requestUrlPartners = "https://api.freee.co.jp/api/1/partners?company_id=**********&limit=500"; //取引先情報を取得するパラメーター
//データをリクエストする
var headers = { "Authorization" : "Bearer " + accessToken};
var options =
{
"method" : "get",
"headers" : headers
};
//レスポンスデータを受け取る
var JSON_response_bs = UrlFetchApp.fetch( requestUrlBs , options ).getContentText();
var JSON_response_partners = UrlFetchApp.fetch( requestUrlPartners , options ).getContentText();
var Data_bs = JSON.parse( JSON_response_bs );
var Data_partners = JSON.parse( JSON_response_partners );
//レスポンスデータを加工する
var Target = Data_bs.trial_bs.balances;
var partners = Data_partners.partners;
var partners_name_only = []; //取引先名の名前を保管する配列
for(var p = 0; p < partners.length; p++) {
partners_name_only.push(
partners[p].name
);
};
var search = "売掛金"
//加工済みのレスポンスデータの中で売掛金が配列の何番目に保存されているか検索し、該当する番号で繰り返し処理から抜ける
for(var i = 0; i < Target.length; i++) {
if(Target[i]["account_item_name"] == search) {
var index = i;
break;
}
}
var Target = Target[index]["partners"]; //BSの中の売掛金だけを取引先別で変数に保存し直す
var header_data = [[ //スプレッドシートへの出力用のヘッダー
'コード',
'取引先名',
start_date + '時点',
'借方金額',
'貸方金額',
end_date + '時点'
]];
var account_receivavle_data = []; //売掛金情報を保存する配列
for (var i = 0 ; i < Target.length ; i++) {
if(Target[i].name == "未選択"){ //取引先が未選択の場合
account_receivavle_data.push([
"00000", //未選択用の仮コード
"未選択", //取引先名を未選択で表示
Target[i].opening_balance, //期首残高
Target[i].debit_amount, //借方金額
Target[i].credit_amount, //貸方金額
Target[i].closing_balance //期末残高
]);
} else {
account_receivavle_data.push([
partners[partners_name_only.indexOf(Target[i].name)].code, //取引先一覧の配列の中から、売掛金のある取引先の取引先コードを出力
Target[i].name, //取引先名
Target[i].opening_balance, //期首残高
Target[i].debit_amount, //借方金額
Target[i].credit_amount, //貸方金額
Target[i].closing_balance //期末残高
]);
}
};
//出力初期設定
var body_row_length = account_receivavle_data.length; //中核となるデータの行数
var all_row_length = body_row_length + 2; //全データの行数
var column_length = account_receivavle_data[0].length; //全タータの列数
var color_black = '#000000'; //罫線の色
var border_style_solid = SpreadsheetApp.BorderStyle.SOLID; //罫線のスタイル
var range_all = sheet.getRange(1, 1, body_row_length + 2, column_length); //全データの範囲を指定
var range_header = sheet.getRange(1, 1, 1, column_length); //見出しに当たる部分を指定
var range_body = sheet.getRange(2, 1, body_row_length, column_length); //中核となるデータの範囲を指定
var range_number = sheet.getRange(1, 3, all_row_length, 4); //データが数字である範囲を指定
var range_footer = sheet.getRange(body_row_length + 2, 1, 1, column_length); //最終行となるフッターの範囲を指定
sheet.clear(); //データをクリアする
sheet.clearFormats(); //データのフォーマットをクリアする
//出力する データ
range_header.setValues(header_data); //見出し部分にデータをセット(出力)する
range_body.setValues(account_receivavle_data); //中核となる部分のデータをセット(出力)する
range_body.sort(1); //データを昇順で並べ替える
range_footer.setFormulas([[ //フッターのデータをセット(出力)する
'',
'',
'=sum(C2:C'+ (body_row_length + 1) + ')', //SUM関数で各列の合計
'=sum(D2:D'+ (body_row_length + 1) + ')',
'=sum(E2:E'+ (body_row_length + 1) + ')',
'=sum(F2:F'+ (body_row_length + 1) + ')'
]])
range_number.setNumberFormat('#,##0'); //データが数字部分のフォーマットをセットする
range_all.setBorder(true, true, true, true, true, true, color_black, border_style_solid); //罫線をセット(出力)する
sheet.setColumnWidth(1, 100); //列の幅をセットする
sheet.setColumnWidth(2, 180);
sheet.setColumnWidth(3, 125);
sheet.setColumnWidth(6, 125);
for(var i = 0; i < all_row_length; i++) { //データが保存されている行の高さをセットする
sheet.setRowHeight(i+1, 30);
};
};
function getAccountReceivavle() { //スプレッドシートの設定 var ss = SpreadsheetApp.openById("*********************************"); //スプレッドシートを指定する***にはスプレッドシートIDを入力してください var date_sheet = ss.getSheetByName('日付'); //スプレッドシートのシートを指定する var start_date = date_sheet.getRange('A2').getDisplayValue(); //期首の日付を指定する var end_date = date_sheet.getRange('B2').getDisplayValue(); //期末の日付を指定する var sheet = ss.getSheetByName("売掛金残高"); //売掛金情報を出力したいシートを指定する //合鍵を制作する var freeeApp = getService(); //freeeのAPI認証 var accessToken = freeeApp.getAccessToken(); //パラメーターを指定する ***にはcompany_idが入ります var requestUrlBs = "https://api.freee.co.jp/api/1/reports/trial_bs?company_id=**********&breakdown_display_type=partner" + '&end_date=' + end_date + '&start_date=' + start_date; //期間指定した取引先別のBS情報を取得するパラメーター var requestUrlPartners = "https://api.freee.co.jp/api/1/partners?company_id=**********&limit=500"; //取引先情報を取得するパラメーター //データをリクエストする var headers = { "Authorization" : "Bearer " + accessToken}; var options = { "method" : "get", "headers" : headers }; //レスポンスデータを受け取る var JSON_response_bs = UrlFetchApp.fetch( requestUrlBs , options ).getContentText(); var JSON_response_partners = UrlFetchApp.fetch( requestUrlPartners , options ).getContentText(); var Data_bs = JSON.parse( JSON_response_bs ); var Data_partners = JSON.parse( JSON_response_partners ); //レスポンスデータを加工する var Target = Data_bs.trial_bs.balances; var partners = Data_partners.partners; var partners_name_only = []; //取引先名の名前を保管する配列 for(var p = 0; p < partners.length; p++) { partners_name_only.push( partners[p].name ); }; var search = "売掛金" //加工済みのレスポンスデータの中で売掛金が配列の何番目に保存されているか検索し、該当する番号で繰り返し処理から抜ける for(var i = 0; i < Target.length; i++) { if(Target[i]["account_item_name"] == search) { var index = i; break; } } var Target = Target[index]["partners"]; //BSの中の売掛金だけを取引先別で変数に保存し直す var header_data = [[ //スプレッドシートへの出力用のヘッダー 'コード', '取引先名', start_date + '時点', '借方金額', '貸方金額', end_date + '時点' ]]; var account_receivavle_data = []; //売掛金情報を保存する配列 for (var i = 0 ; i < Target.length ; i++) { if(Target[i].name == "未選択"){ //取引先が未選択の場合 account_receivavle_data.push([ "00000", //未選択用の仮コード "未選択", //取引先名を未選択で表示 Target[i].opening_balance, //期首残高 Target[i].debit_amount, //借方金額 Target[i].credit_amount, //貸方金額 Target[i].closing_balance //期末残高 ]); } else { account_receivavle_data.push([ partners[partners_name_only.indexOf(Target[i].name)].code, //取引先一覧の配列の中から、売掛金のある取引先の取引先コードを出力 Target[i].name, //取引先名 Target[i].opening_balance, //期首残高 Target[i].debit_amount, //借方金額 Target[i].credit_amount, //貸方金額 Target[i].closing_balance //期末残高 ]); } }; //出力初期設定 var body_row_length = account_receivavle_data.length; //中核となるデータの行数 var all_row_length = body_row_length + 2; //全データの行数 var column_length = account_receivavle_data[0].length; //全タータの列数 var color_black = '#000000'; //罫線の色 var border_style_solid = SpreadsheetApp.BorderStyle.SOLID; //罫線のスタイル var range_all = sheet.getRange(1, 1, body_row_length + 2, column_length); //全データの範囲を指定 var range_header = sheet.getRange(1, 1, 1, column_length); //見出しに当たる部分を指定 var range_body = sheet.getRange(2, 1, body_row_length, column_length); //中核となるデータの範囲を指定 var range_number = sheet.getRange(1, 3, all_row_length, 4); //データが数字である範囲を指定 var range_footer = sheet.getRange(body_row_length + 2, 1, 1, column_length); //最終行となるフッターの範囲を指定 sheet.clear(); //データをクリアする sheet.clearFormats(); //データのフォーマットをクリアする //出力する データ range_header.setValues(header_data); //見出し部分にデータをセット(出力)する range_body.setValues(account_receivavle_data); //中核となる部分のデータをセット(出力)する range_body.sort(1); //データを昇順で並べ替える range_footer.setFormulas([[ //フッターのデータをセット(出力)する '', '', '=sum(C2:C'+ (body_row_length + 1) + ')', //SUM関数で各列の合計 '=sum(D2:D'+ (body_row_length + 1) + ')', '=sum(E2:E'+ (body_row_length + 1) + ')', '=sum(F2:F'+ (body_row_length + 1) + ')' ]]) range_number.setNumberFormat('#,##0'); //データが数字部分のフォーマットをセットする range_all.setBorder(true, true, true, true, true, true, color_black, border_style_solid); //罫線をセット(出力)する sheet.setColumnWidth(1, 100); //列の幅をセットする sheet.setColumnWidth(2, 180); sheet.setColumnWidth(3, 125); sheet.setColumnWidth(6, 125); for(var i = 0; i < all_row_length; i++) { //データが保存されている行の高さをセットする sheet.setRowHeight(i+1, 30); }; };
function getAccountReceivavle() {
  //スプレッドシートの設定
  var ss = SpreadsheetApp.openById("*********************************"); //スプレッドシートを指定する***にはスプレッドシートIDを入力してください
  var date_sheet = ss.getSheetByName('日付'); //スプレッドシートのシートを指定する
  var start_date = date_sheet.getRange('A2').getDisplayValue(); //期首の日付を指定する
  var end_date = date_sheet.getRange('B2').getDisplayValue(); //期末の日付を指定する
  var sheet = ss.getSheetByName("売掛金残高"); //売掛金情報を出力したいシートを指定する

  //合鍵を制作する
  var freeeApp = getService(); //freeeのAPI認証
  var accessToken = freeeApp.getAccessToken();

  //パラメーターを指定する ***にはcompany_idが入ります
  var requestUrlBs = 
      "https://api.freee.co.jp/api/1/reports/trial_bs?company_id=**********&breakdown_display_type=partner" + '&end_date=' + end_date + '&start_date=' + start_date; //期間指定した取引先別のBS情報を取得するパラメーター
  var requestUrlPartners = "https://api.freee.co.jp/api/1/partners?company_id=**********&limit=500"; //取引先情報を取得するパラメーター
  //データをリクエストする
  var headers = { "Authorization" : "Bearer " + accessToken};
  var options = 
  { 
    "method" : "get",
    "headers" : headers
  };

  //レスポンスデータを受け取る
  var JSON_response_bs = UrlFetchApp.fetch( requestUrlBs , options ).getContentText();
  var JSON_response_partners = UrlFetchApp.fetch( requestUrlPartners , options ).getContentText();
  var Data_bs = JSON.parse( JSON_response_bs );
  var Data_partners = JSON.parse( JSON_response_partners );

  //レスポンスデータを加工する
  var Target = Data_bs.trial_bs.balances;
  var partners = Data_partners.partners;
  var partners_name_only = []; //取引先名の名前を保管する配列
  for(var p = 0;  p < partners.length; p++) {
    partners_name_only.push(
      partners[p].name
    );
  };
  var search = "売掛金"
  //加工済みのレスポンスデータの中で売掛金が配列の何番目に保存されているか検索し、該当する番号で繰り返し処理から抜ける
  for(var i = 0; i < Target.length; i++) {
    if(Target[i]["account_item_name"] == search) {
      var index = i;
      break;
    }
  }
  var Target = Target[index]["partners"]; //BSの中の売掛金だけを取引先別で変数に保存し直す
  var header_data = [[ //スプレッドシートへの出力用のヘッダー
    'コード',
    '取引先名',
    start_date + '時点',
    '借方金額',
    '貸方金額',
    end_date + '時点'
  ]];
  
  var account_receivavle_data = []; //売掛金情報を保存する配列

  for (var i = 0 ; i < Target.length ; i++) {
    if(Target[i].name == "未選択"){ //取引先が未選択の場合
      account_receivavle_data.push([
        "00000", //未選択用の仮コード
        "未選択", //取引先名を未選択で表示
        Target[i].opening_balance, //期首残高
        Target[i].debit_amount, //借方金額
        Target[i].credit_amount, //貸方金額
        Target[i].closing_balance //期末残高
      ]);    
    } else {
      account_receivavle_data.push([
        partners[partners_name_only.indexOf(Target[i].name)].code, //取引先一覧の配列の中から、売掛金のある取引先の取引先コードを出力
        Target[i].name, //取引先名
        Target[i].opening_balance, //期首残高
        Target[i].debit_amount, //借方金額
        Target[i].credit_amount, //貸方金額
        Target[i].closing_balance //期末残高
      ]);    
    }
  };
  
  //出力初期設定
  var body_row_length = account_receivavle_data.length; //中核となるデータの行数
  var all_row_length = body_row_length + 2;  //全データの行数
  var column_length = account_receivavle_data[0].length; //全タータの列数
  var color_black = '#000000'; //罫線の色
  var border_style_solid = SpreadsheetApp.BorderStyle.SOLID; //罫線のスタイル
  var range_all = sheet.getRange(1, 1, body_row_length + 2, column_length); //全データの範囲を指定
  var range_header = sheet.getRange(1, 1, 1, column_length); //見出しに当たる部分を指定
  var range_body = sheet.getRange(2, 1, body_row_length, column_length); //中核となるデータの範囲を指定
  var range_number = sheet.getRange(1, 3, all_row_length, 4); //データが数字である範囲を指定
  var range_footer = sheet.getRange(body_row_length + 2, 1, 1, column_length); //最終行となるフッターの範囲を指定
  sheet.clear(); //データをクリアする
  sheet.clearFormats(); //データのフォーマットをクリアする

  //出力する データ
  range_header.setValues(header_data); //見出し部分にデータをセット(出力)する
  range_body.setValues(account_receivavle_data); //中核となる部分のデータをセット(出力)する
  range_body.sort(1); //データを昇順で並べ替える
  range_footer.setFormulas([[ //フッターのデータをセット(出力)する
    '',
    '',
    '=sum(C2:C'+ (body_row_length + 1) + ')', //SUM関数で各列の合計
    '=sum(D2:D'+ (body_row_length + 1) + ')',
    '=sum(E2:E'+ (body_row_length + 1) + ')',
    '=sum(F2:F'+ (body_row_length + 1) + ')'
  ]])
  range_number.setNumberFormat('#,##0'); //データが数字部分のフォーマットをセットする
  range_all.setBorder(true, true, true, true, true, true, color_black, border_style_solid); //罫線をセット(出力)する
  sheet.setColumnWidth(1, 100); //列の幅をセットする
  sheet.setColumnWidth(2, 180);
  sheet.setColumnWidth(3, 125);
  sheet.setColumnWidth(6, 125);
  for(var i = 0; i < all_row_length; i++) { //データが保存されている行の高さをセットする
    sheet.setRowHeight(i+1, 30);
  };
};

コマンドを表示させるコードを記述

function onOpen(){
var ui = SpreadsheetApp.getUi();
var menu = ui.createMenu('売掛金コマンド');
menu.addItem('売掛金情報を取得', 'getAccountReceivavle');
menu.addToUi();
}
function onOpen(){ var ui = SpreadsheetApp.getUi(); var menu = ui.createMenu('売掛金コマンド'); menu.addItem('売掛金情報を取得', 'getAccountReceivavle'); menu.addToUi(); }
function onOpen(){
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('売掛金コマンド');
  menu.addItem('売掛金情報を取得', 'getAccountReceivavle');
  menu.addToUi();
}

カスタマイズ事例

上記のコードをベースに、以下のようなカスタマイズも可能です。

他の勘定科目を取得する

・取引先別の買掛金(取引先コード順)の試算表を取得する

・取引先別の未払金(取引先コード順)の試算表を取得する

エラーを表示する

・取引先コードが未入力の場合、エラーを表示する

・取引先名が”未選択”の場合、エラーを表示する

・期末残高が金額が一定額以上であればエラーを表示する

・期首残高と期末残高の増加率が一定以上であればエラーを表示する

ユーザーに通知する

・エラー内容をMailやチャットツール(slackやchatworkなど)に通知する

・エラー内容をブラウザ上にアラートとして表示する

・エラー箇所を明示した上でエラー内容を通知する

まとめ

いかがでしたでしょうか。

今回は、取引先別の売掛金の試算表を取引先コード順でスプレッドシートに出力する方法をお伝えしました。

自社の業務に沿ったカスタマイズを行い、業務効率化などのお力になれれば幸いです。

*本記事に関するご質問や感想はコメント欄で受け付けております。