[GAS]会計freeeAPIを使って残高確認表を作成しよう

GAS

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は1回目で 「連載の概要と準備運動」 をお届けします。

この連載について

今日の前半は、この連載についてお伝えします。

対象となる読者

この連載では、以下をクリアした読者を対象としております。
– GASでスプレッドシートを操作したことがある方
– 会計freeeで銀行口座の連携をしている方

GASの基礎を学びたい方にはぜひノンプロ研をご紹介します。銀行口座の連携方法などは、freee公式サイトを参考にしてください。

クラウド会計ソフトとAPI

「会計freee」はクラウド会計ソフトの1つです。大きな特徴は 「API(エーピーアイ)」 という、アプリとアプリを連携する技術を使っていることです。

たとえば、会計freeeは自身を1つのアプリとして、日本全国の「銀行データベースアプリ」とAPIで連携しています。 預金口座情報をリアルタイムに取得 したり、クレジットカード会社と連携して 決済情報を取得 しています。

また、スプレッドシートもアプリの1つと言えます。APIを操作することにより、会計freeeとスプレッドシートの連携を自動化 できます。

この連載のゴール

この連載では、月に一度程度発生する取引先ごとの 「残高確認表作成業務の自動化」 を目指します。

普段から、「残高確認表」を作成するのに、csvで取り込みをしたり、記帳した通帳を目で見てExcelを作成している人も多いと思います。

この、csvの取り込みや、手動コピペをできるだけ自動化し、効率化を目指したい と思います。

具体的には、以下のような作業を自動化できるようになります。
– 会計freeeの「口座の明細」をスプレッドシートに流し込みたい
– 会計freeeの「取引」をスプレッドシートから登録したい
– 毎月スプレッドシートを作成したい
– 会計freeeAPIを定期的に操作したい

「残高確認表」だけで言えば、会計freee上でも作成できる帳票です。

しかしながら、世の中には会計freeeでは対応していない帳票もありますので、必要な項目を会計freeeから取得することは、みなさんの業務効率化の手助けになると思っています。

事前準備と予備知識

今日の後半は、事前準備と予備知識についてお伝えします。

事前準備1:スプレッドシートとコンテナバインドスクリプト

スプレッドシートの準備

この連載では「残高確認表」をスプレッドシートで作成します。まずは、このようなスプレッドシートを用意しましょう。

コンテナバインドスクリプトの準備

APIの操作や、スプレッドシートの作成はすべてGASで行います。freeeはGASを推奨しておりますので、公式ドキュメントやチュートリアルなどが豊富に用意されています。

残高確認確認表のコンテナバインドスクリプトを用意しましょう。

ライブラリ[OAuth2.0]を使用します。下記スクリプトIDからインストールしましょう。

スクリプトID:1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

事前準備2:銀行口座の連携

会計freeeでアカウントを開設して、銀行口座の連携を済ませておきましょう。トップページのメニュー[口座]から、[口座の一覧・登録]をクリックすると、連携している口座一覧が表示されます。

口座名をクリックすると、預金口座の明細を確認できます。このように、普段通帳で見るような情報を取得できていれば問題ありません。


予備知識1:「取引」と「登録」

会計freeeでは、会社の入金や出金など、お金に関する動きを「取引」と呼んでいます。実は、銀行口座の連携ができている人は、入出金情報を取引として取得できています。

トップページの[取引]メニューから、[自動で経理]をクリックして、すでに取得できている取引を確認してみましょう。

このように、取引の一覧が表示されます。期末に会計処理を行うために <未処理>の取引を、勘定科目や取引先を正しく設定して「登録」する のが、経理のお仕事です。

予備知識2:自動で経理

それでは経理担当者になったつもり(間違えても大丈夫です)で、未処理の取引を登録してみます。未処理の取引一覧から[詳細]をクリックします。

登録には「発生日」「勘定科目」「税区分」「金額」の必須項目に加えて、「取引先」「品目」など、ユーザーが自由に指定できる項目が用意されています。

そしてなんと、会計freeeの[自動で経理]は勘定科目などをAIで判定 しており、項目を予測入力してくれています。以下の例では、勘定科目に[売上高]が予測入力されています。取引の登録作業時間を大幅に短縮できますね。

会計freeeにデータがたまってくると、取引のパターンをAIが判定してくれるようになりますので、予測入力も正確性が増してきます。ただし、すべての項目が自動で入力されるとは限りませんので、不足している項目は入力しましょう。

基本的に、銀行口座から取得した取引はすべて登録しましょう。未処理が1件もない状態が望ましいです。(勘定科目がわからない取引は、税理士や青色申告会などに相談して登録しましょう。)

連載の後半では、取引の登録も自動化します。

まとめ

以上で、「連載の概要と準備運動」 ということで、この連載の概要と、事前準備・予備知識についてお届けしました。

次回は 「アプリとアクセストークンを準備する」 をお届けします。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は2回目で 「アプリとアクセストークンを準備する」 をお届けします。

前回のおさらい

前回は、「連載の概要と準備運動」 ということで、この連載の概要と、事前準備・予備知識についてお届けしました。

[GAS]会計freeeAPIを使って残高確認表を作成しよう
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は1回目で 「連載の概要と準備運動」 をお届けします。この連載について今日の前半は、この連載

今回は、「アプリとアクセストークンを準備する」 をお届けします。

「アプリ」と「アクセストークン」は、一度作成すればよいもので、GASを実行するたびに設定を確認したり、変更するものではありません。

この連載では、認証の仕組みについて深い解説はしませんので、必要なスクリプトを実行できるように読み進めていきましょう。

アプリ

前半は、「アプリ」についてです。

アプリとは

「アプリ」とは、会計freee上のさまざまな情報を操作するための「アプリケーション」の略です。会計freeeでは、ユーザーが作成したアプリを 「マイアプリ」 と呼びます。

マイアプリはGASで操作します。その、最大の役割は「本人確認」です。会計freee上には機密情報がたくさん登録されています。情報を操作するための本人確認を、マイアプリできちんと行います。

マイアプリの作成方法

会計freeeにログインします。

事業所が1つしかない場合や、アカウントを切り替える必要がない場合は、この手順は飛ばしてください。右上のアカウント情報をクリックして、事業所を切り替えます。

ご自身のアカウントでは操作をしたくないという方は、freeeで用意されている「開発用テスト事業所」を作成することを強くオススメします。架空の銀行口座や、取引のダミーデータが登録されていますので、本番と同様のテストができます。

freee API スタートガイド - freee Developers Community
freee API スタートガイド 以下の手順に沿ってfreee APIの活用をはじめてみよう ここでは最初のfreee APIコールをするためのテスト事業所やテストアプリケーション(以下の図の黄色)を作成するステップを … Continue reading freee API スタートガイド →

事業所を切り替えたら、[関連プロダクト・サービス]から[freeeアプリストア]をクリックします。

アプリストアが表示されたら、[開発者ページ]をクリックします。

右上の[アプリ管理]をクリックします。

開発アプリ一覧が表示されます。はじめてページを開いたときはアプリがなにもありません。

[+新規追加]をクリックします。

[アプリ名][概要][利用規約の同意]を入力して、最後に右上の[作成]をクリックします。

アプリが作成され、アプリの基本情報画面が表示されます。

基本情報画面では以下の3項目が重要になります。
1. コールバックURL
2. クライアントID
3. クライアントシークレット

後ほど使いますので、メモ帳などにコピペしておきましょう。そしてこの3つは、会計freeeの情報にアクセスするための大切な個人情報 になりますので、他人には教えないようにしましょう。

コールバックURLの設定

コールバックURLには、コンテナバインドスクリプトのスクリプトIDを使用した、下記URLを指定します。

'https://script.google.com/macros/d/スクリプトID/usercallback'

事前準備で作成したコンテナバインドスクリプトのスクリプトIDを確認しましょう。

コールバックURL欄に入力して、必ず「下書き保存」をクリックします。

マイアプリの作成はここまでです。

アクセストークン

後半は、「アクセストークンについて」です。

アクセストークンとは

「アクセストークン」とは、マイアプリが使用する、会計freeeの情報にアクセスするための、いわば秘密のパスワードです。

そして、会計freeeとマイアプリでアクセストークンをやりとりする処理は、完全に自動化されており、私たちユーザーにとって無意識で安全に使えるものになっています。

書かなければならないスクリプトも少ないですので、手順通りに進めましょう。

アクセストークンの取得

スクリプトエディターを開きます。

スクリプトファイル[アクセストークン取得]を作成します。

下記コードをコピペします。

//マイアプリ情報
const CLIENT_ID = 'クライアントID';
const CLIENT_SECRET = 'クライアントシークレット';

// 認証のエンドポイントとなるダイアログを表示します。
function alertAuth() {

const service = getService();
const authorizationUrl = service.getAuthorizationUrl();

const template = HtmlService.createTemplate(
'<a href="<?= authorizationUrl ?>" target="_blank">認証</a>. ' +
'こちらをクリックすると表示される新しいウィンドウで「許可する」をクリックしてください。');
template.authorizationUrl = authorizationUrl;

const page = template.evaluate();
SpreadsheetApp.getUi().showModalDialog(page, "認証をしてください");

}

//freeeAPIのサービスを取得
function getService() {
return OAuth2.createService('freee')
.setAuthorizationBaseUrl('https://accounts.secure.freee.co.jp/public_api/authorize')
.setTokenUrl('https://accounts.secure.freee.co.jp/public_api/token')
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setCallbackFunction('authCallback_')
.setPropertyStore(PropertiesService.getUserProperties())
}

//認証コールバック
function authCallback_(request) {
const service = getService();
const isAuthorized = service.handleCallback(request);

if (isAuthorized) {
return HtmlService.createHtmlOutput('認証に成功しました。ウィンドウを閉じてください。');
} else {
return HtmlService.createHtmlOutput('認証に失敗しました。');
};
}

//アクセストークン取得
function getMyAccessToken() {

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();
console.log(accessToken);

}

マイアプリ情報に、「クライアントID」と「クライアントシークレット」を入力します。

//マイアプリ情報
const CLIENT_ID = 'クライアントID';
const CLIENT_SECRET = 'クライアントシークレット';

alertAuth()を実行したあとに、バインドしているスプレッドシートを開きます。
(初回実行時は認証を求められますので、ご対応お願いします。)

ダイアログメッセージに表示されている[認証]をクリックします。

「アプリ連携の開始」ウィンドウが表示されたら、[許可する]をクリックします。

このような表示がでたら認証成功です。ウィンドウは閉じて構いません。

これで、アクセストークンを取得する準備が整いました。スクリプト内のgetMyAccessToken()を実行してみましょう。

アクセストークンを取得できています。

アクセストークンを取得する準備は、以上です。今後は、プロジェクトの内のどこでも以下のステートメントを記述するだけで、アクセストークンが取得できます。

//アクセストークンを取得する
const accessToken = getService().getAccessToken();

まとめ

以上で、「アプリとアクセストークンを準備する」 ということで、自分専用の「マイアプリ」を作成し、アクセストークンを取得するステートメントを作成しました。

一度認証作業を行えば、後は無意識にアクセストークンを取得できますので、私たちノンプログラマーでも楽にプログラミングができます。

次回は 「会計freeeAPIを操作する」 をお届けします。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は3回目で 「会計freeeAPIを操作する」 をお届けします。

前回のおさらい

前回は、「アプリとアクセストークンを準備する」 ということで、自分専用の「マイアプリ」を作成し、アクセストークンを取得するステートメントを作成しました。

[GAS][会計freee]アプリとアクセストークンを準備する
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は2回目で 「アプリとアクセストークンを準備する」 をお届けします。前回のおさらい前回は、「

今回は 「会計freeeAPIを操作する」 をお届けします。座学的な内容になってしまいますが、きちんとAPIの基礎を理解しましょう。

APIとは

APIに関しては、数多くの記事や書籍があります。なので、今回は「たとえ話」をしてみたいと思います。

APIは、Application Programming Interface (アプリケーション・プログラミング・インタフェース) の略です。

インターフェイスなので、たとえると 「窓口」 だと思っていただいて構いません。

外国人が日本で活躍するには

日本で活躍したい外国人「KENZO-san」が、日本に出入国をする場合は、労働ビザの取得や、許可証の返却など、さまざまな手続きを取る必要があります。

その手続きの窓口になっているのが、「入国管理局」です。

KENZO-sanは、母国語で手続きを行いたいですが、入国管理局は限られた言語のみ受付をしています。大切なのは、やりとりの決まりごとを決めないと、お互いに手続きができないことです。

この決まりごとを 「プロトコル」 と呼びます。

もし、やりとりをインターネットで行う場合は、HTTP、Hyper Text Transfer Protocol(ハイパーテキストトランスファープロトコル)という決まりごとでやりとりをしようね、ということになります。

HTTPリクエスト/レスポンス

「窓口」に対して、HTTPという決まりごとを守って、手続きのお願いをすることを 「HTTPリクエスト」 と呼びます。

一方で、HTTPリクエストを受け取った窓口が、おこなう返事のことを 「HTTPレスポンス」 と呼びます。

入国管理局への手続きは、いくつかの種類があります。
– 届出・・・書類を用意して提出するだけで手続きが完了する
– 申請・・・手続きが完了するためには、入国管理局による審査が必要

なので、目的に合わせてどのような手続きが必要なのか、ちゃんと理解する必要があります。

同様に、HTTPリクエストにも、いくつかの種類があります。
– GET・・・情報を取得する
– POST・・・情報を作成する
– DELETE・・・情報を削除する
– PUT・・・情報を更新する

なので、「窓口」つまり相手側のAPIに対して、適切なHTTPリクエストを送信することで、希望する返答「HTTPレスポンス」を受け取ることが、「APIを操作する」 といえます。

最近よく耳にする「API」は、ほぼインターネット上でやりとりをしますので 「Web API」 とも呼ばれます。

エンドポイント

APIはアプリケーションの窓口のことでしたが、手続きのために公開されている受付が 「エンドポイント」 です。

手続きによって、やりとりをするエンドポイントが変わります。

Web APIでは、インターネットでやりとりをしますので、エンドポイントが変わるということは、手続きによって、アクセスするURL先を変えていく ということです。

エンドポイントは、APIを公開しているサービス側で情報提供していることが多いです。この情報提供を 「リファレンス」 と呼びます。よくビジネスの世界で「リファレンスを参照してください」と言いますが、「リファレンス」とは「参照」という意味 なので、やたらカタカナ語を使うのは避けた方がいいですね。。

会計freeeのAPIリファレンス

会計freeeには、会計APIリファレンス(以降、リファレンス)が用意されています。

会計APIリファレンス - freee Developers Community
   

リファレンスは項目ごとに分かれており、「HTTPリクエストの種類」、「目的」、「エンドポイント」が分かりやすく表示されています。

たとえ話のKENZO-sanは、ここでさようならです。日本で活躍することはもちろん、世界で活躍するビジネスマンを目指しているそうです。

HTTPリクエスト

会計freeeAPIを操作するということは、HTTPリクエストを正しく送信するということでした。

今回は「増えすぎてしまった取引先を管理したい」という要求に応えたいと思います。

それでは、実際にHTTPリクエストを送信する流れを確認しましょう。

リファレンスの確認:GET

HTTPリクエストを送信する際に、まず最初に行うことは、リファレンスを確認 することです。

[Partners取引先]という項目があります。

まずは登録されているすべての取引先を見たいと思いますので「取引先一覧の取得」をクリックします。

取引先一覧の取得のHTTPリクエストの種類は「GET」です。

GETには、3つの項目が表示されています。
– 概要・・・このエンドポイントの概要
– Parameters(パラメーター)・・・エンドポイントの詳細設定方法
– Responses(レスポンス)・・・受け取るHTTPレスポンス例

Partnersの[Try it out]をクリックすると、エンドポイントに付与する詳細を入力できます。

「取引先一覧の取得」では以下の4項目を指定できるようです。

パラメーターの入力が終わったら[Excute]をクリックします。

画面をスクロールすると、[Request URL](リクエストURL)が生成されています。

このリクエストURLを使って、会計freeeからデータを取得することになります。GASの書き方は追ってご説明いたします。

リファレンスの確認:POST

新しく取引先を登録したいという場合は、「取引先の作成」をクリックします。

取引先の作成のHTTPリクエストの種類は「POST」です。POSTには 「リクエストボディ」 と呼ばれる、POSTリクエストで送信可能なテキストデータを設定する項目があります。

POSTには、4つの項目が表示されています。
– 概要・・・このエンドポイントの概要
– Parameters(パラメーター)・・・エンドポイントの詳細設定方法
– Request body(リクエストボディ)・・・POSTリクエストで送信可能なテキストデータ
– Responses(レスポンス)・・・受け取るHTTPレスポンス例

Partnersの[Try it out]をクリックすると、リクエストボディを作成できます。

あらかじめ初期データが入力さていますので、必要に応じて、テキストを変更してください。

リクエストボディの入力が終わったら[Excute]をクリックします。

画面をスクロールすると、[Request URL](リクエストURL)が生成されています。

POSTリクエストの場合、この「リクエストURL」と「リクエストボディ」を使って、会計freeeにデータを登録することになります。GASの書き方は追ってご説明いたします。

HTTPレスポンス

これまでは、HTTPリクエストをみてきました。最後に 「HTTPレスポンス」 を確認しましょう。

おさらいですが、HTTPレスポンスとは、HTTPリクエストを受け取った窓口が、おこなう返事のこと でした。

では、実際にはどのような返事をするのでしょうか。

リファレンスの確認

ふたたび、「取引先一覧の取得」のリファレンスを確認します。

Responses(レスポンス)は、このような見出しの構造になっています。

Code:Description

わかりやすく日本語にするとこのようになります。

ステータスコード:説明

ステータスコード

ステータスコードとは、HTTPリクエストが正常に受け付けされたかを示すコードです。

世界中で、一番有名なステータスコードは 「404 Not Found」 だと思います。「URLが不明です」というエラーメッセージです。

「200」はHTTPリクエストが成功したことを示すステータスコードです。

リファレンスのResponses(レスポンス)の1項目目は、ステータスコードが200だった場合(HTTPリクエストが成功した場合)、どのようなレスポンスを返すのか が表示されています。

同様に、ステータスコードが400だった場合(HTTPリクエストが失敗した場合)、どのようなレスポンスを返すのかが表示されています。

JSONとは

レスポンスの中身は、「JSON形式」 と呼ばれる テキストデータ です。

JSONについて詳しい解説は、過去にブログを書いたことがありますので、こちらもご参照いただければ幸いです。

[JSON]【基礎前編】JSONとは何か
どうも。つじけ(tsujikenzo)です。このシリーズでは、JSONについて、全3回でお送りします。(2021年11月に大幅にリニューアルしました)はじめにJSONは、JavaScript Object Notationの略です。2006

JSONの加工(詳細は後述)

以下の、2つのメソッドを覚えていただければ問題ありません。

//responseをJSONオブジェクトに変換する
JSON.parse(response);

//オブジェクトをJSON文字列に変換する
JSON.stringify(object);

今回はメソッドの紹介だけです。2つのメソッドの詳しい解説は、次回以降、GASを書くときにお伝えします。

まとめ

以上で、「会計freeeAPIを操作する」 ということで、「APIとはなにか」、「HTTPリクエストとHTTPレスポンス」などをお届けしました。

座学的な内容ばかりで、退屈だったかもしれません。。。

次回以降はGASを使って、会計freeeAPIをガンガン操作していきたいと思います。

「HTTPリクエストを送信」とか、「HTTPリクエストが成功」とか、「HTTPレスポンスがJSONを返す」といった動作を、実際に手を動かして経験していきましょう。

次回は 「事業所IDを取得しよう」 をお届けします。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は4回目で 「事業所IDを取得しよう」 をお届けします。

前回のおさらい

前回は、「会計freeeAPIを操作する」 ということで、「APIとはなにか」、「HTTPリクエストとHTTPレスポンス」などをお届けしました。

[GAS][会計freee]会計freeeAPIを操作する
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は3回目で 「会計freeeAPIを操作する」 をお届けします。前回のおさらい前回は、「アプ

今回は、「事業所IDを取得しよう」 をお届けします。

事業所IDとは

会計freeeでは、1つのアカウントで複数の事業所を持てます。

第2回目の「マイアプリを作成する」のときに、事業所を切り替える作業を行いましたね。

事業所には、固有のIDが割り振られています。事業所が1つだけしかない人も、まずは事業所IDの確認が必要です。

事業所IDは、会計freeeAPIを操作して、取得できます。

リファレンスの確認

「事業所IDを取得する」ということをやりたい場合は、まずは リファレンスの確認 です。

[事業所一覧の取得]をクリックします。

Responses(レスポンス)を確認します。HTTPリクエストが成功すると、このようなJSONが返ってくるようです。

リクエストURLの作成

リクエストURLを作成します。Partners(パラメーター)の[Try it out]をクリックします。

[Excute]をクリックします。

画面をスクロールすると、[Request URL](リクエストURL)が生成されました。後で必要になりますので、コピーしておきましょう。

HTTPリクエストを送信

スクリプトエディタを開きます。これからコーディングしますが、作業場として、「事業所一覧の取得」ファイルを作成した方が分かりやすいでしょう。

HTTPリクエストをリクエストURLに送信するコードはこちらです。

const response = UrlFetchApp.fetch(requestUrl, params);

引数に必要な[リクエストURL]は、さきほど確認しましたね。変数に代入しておきます。

const requestUrl = 'https://api.freee.co.jp/api/1/companies';

引数に必要なparamsを作成するコードはこちらです。

const params = {
method: "GET",
headers: {"Authorization":"Bearer " + accessToken}
};

レスポンスを閲覧するコードはこちらです。普段はconsole.log()を使うと思いますが、閲覧だけならLogger.log() で構いません。

Logger.log(response);

以上を組み合わせたコードがこちらです。第2回目で登場したアクセストークンを取得するコードも使用します。

/**
* 事業所一覧を取得する関数
*
* @param none
* @return none
*/
function getMyCompanies() {

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();

//HTTPリクエストを送る時に必要なパラメーター
const params = {
method: "GET",
headers: {"Authorization":"Bearer " + accessToken}
};

//事業所一覧を取得するためのリクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/companies';

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

//レスポンスの中身を閲覧する
Logger.log(response);

}

HTTPレスポンスの確認(閲覧)

関数getMyCompanies()を実行して、実行ログを確認しましょう。

私のアカウントには2つの事業所がありますので、2つの事業所IDが取得できています。

事業所IDは数字の7桁です。今後変わることはありませんので、実行ログを目で確認して、メモしておきましょう。

まとめ

以上で、「事業所IDを取得しよう」 ということで、実際にHTTPリクエストをリクエストURLに送信しました。

送信すると同時に、会計freeeから受け取ったHTTPレスポンスを、変数responseに代入しました。

このように、HTTPリクエストの種類「GET」は、リクエストURL以外はほぼ定型文 です。

リファレンスを確認しながら、正しくリクエストURLを生成すれば問題ありません。

次回は、GETの復習として 「取引(収入/支出)を取得しよう」 をお届けします。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は5回目で 「取引を取得(収入/支出)しよう」 をお届けします。

前回のおさらい

前回は、「事業所IDを取得しよう」 ということで、実際にHTTPリクエストをリクエストURLに送信しました。

HTTPリクエストが成功すると、HTTPレスポンスとして、responseを受け取ることを確認しましたね。

[GAS][会計freee]事業所IDを取得しよう
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は4回目で 「事業所IDを取得しよう」 をお届けします。前回のおさらい前回は、「会計free

今回は、GETの復習として 「取引(収入/支出)を取得しよう」 をお届けします。

取引(収入/支出)一覧の取得

事業所一覧の取得と同様に、取引(収入/支出)一覧も取得できます。

「取得」ですので、HTTPリクエストの種類は「GET」です。復習しましょう。

リファレンスの確認

[取引(収入/支出)一覧]をクリックします。

Responses(レスポンス)を確認します。HTTPリクエストが成功すると、このようなJSONが返ってきます。

プロパティ[deals]は、配列の要素に {取引(収入/支出)n} を格納しているようです。

{"deals":[
{取引(収入/支出)1},
{取引(収入/支出)2},
{取引(収入/支出)3}
]
}

リクエストURLの作成

リクエストURLを作成します。Partners(パラメーター)の[Try it out]をクリックします。

事業所IDを入力します。

取引の検索対象の[開始日]と[終了日]を入力します。yyyy-mm-dd形式ですのでお間違えなく。

パラメーターの入力が終わったら[Excute]をクリックします。

画面をスクロールすると、[Request URL](リクエストURL)が生成されています。

HTTPリクエストを送信

前回の復習です。HTTPリクエストをリクエストURLに送信してみましょう。

/**
* 取引(収入/支出)一覧を取得する関数
*
* @param none
* @return none
*/
function getMyDeals() {

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();

//HTTPリクエストを送る時に必要なパラメーター
const params = {
method: "GET",
headers: {"Authorization":"Bearer " + accessToken}
};

//事業所一覧を取得するためのリクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/deals?company_id=3195480&start_issue_date=2021-05-01&end_issue_date=2021-05-31';

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

//レスポンスの中身を閲覧する
Logger.log(response);

}

実行ログを確認すると、(件数が多くて表示できていませんが)レスポンスとしてJSONを受け取っています。

HTTPレスポンスの確認

レスポンスをJSONオブジェクトに変換するメソッドは、こちらでした。

//responseをJSONオブジェクトに変換する
JSON.parse(response);

responseをJSON.parse()メソッドでオブジェクトに変換します。

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

//レスポンスの中身を閲覧する
// Logger.log(response);

//JSONオブジェクトに変換
const jsonObj = JSON.parse(response);

オブジェクトですので、プロパティのブラケット記法で要素にアクセスできます。

//JSONオブジェクトに変換
const jsonObj = JSON.parse(response);

//取引(収入/支出)の配列を取得する
const deals = jsonObj['deals'];
console.log(deals);  // [{取引(収入/支出)1},{取引(収入/支出)2},{取引(収入/支出)3}]

実行ログを確認してみましょう。dealsにはこのように、配列で取引(収入/支出)が格納されています。

データの加工

取得した配列は、最終的に2次元配列としてスプレッドシートに貼り付けますが、配列の要素数を合わせるなど、データの加工 が必要です。

たとえば、取引(収入/支出)の中には、複数の取引が含まれる取引 があります。

通常の取引(収入/支出)とはプロパティの数が異なりますので、データの加工が必要です。

イメージとしては、下記のような「要素に配列が含まれている配列」の加工です。

//元の配列
['a','b',[1,2,3]]

//加工後の配列
['a','b',1]
['a','b',2]
['a','b',3]

いろいろな書き方があると思いますが、私はこのような関数を作成しました。

/**
* 1つの取引(収入/支出)オブジェクトを渡すと、全ての2次元配列を返すサブ関数
*
* @param {object}  1つの取引(収入/支出)オブジェクト
* @return {object} 2次元配列
* ※【注意】55行目のpush()、56行目のマジックナンバーは会計freeeでプロパティの仕様変更があると動かなくなる ※
*/
function getFullArray_(deal) {

//最上層のプロパティを格納
const upperProperties = Object.values(deal);

//detailsプロパティを格納
const details = deal['details'];
const detailsArray = details.map(detail => Object.values(detail));

//paymentプロパティを格納
const payments = deal['payments'];

//deal['payments']プロパティが無い場合、paymentsArrayを作る
let paymentsArray;
try {
paymentsArray = payments.map(payment => Object.values(payment)).flat();
} catch{
upperProperties.push(''); //配列の要素数を合わせる為
paymentsArray = [0, 0, 0, 0, 0];
}

//detailsプロパティを基点に、fullArrayを整形
const fullArray = detailsArray.map(detail => {

return [...upperProperties, ...detail, ...paymentsArray];

}
);

return fullArray;
}

先ほど変数に格納した[deals]は、map()メソッドで2次元配列化します。

//全ての項目を2次元配列化する(サブ関数を使用)
const values = deals.map(deal => getFullArray_(deal)).flat();

スプレッドシートへの貼り付け

完成したコードがこちらです。

/**
* 取引(収入/支出)一覧をスプレッドシートへ出力する関数
*
* @param none
* @return none
*/
function getMyDeals() {

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();

//HTTPリクエストを送る時に必要なパラメーター
const params = {
method : "GET",
headers: { "Authorization": "Bearer " + accessToken }
};

//事業所一覧を取得するためのリクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/deals?company_id=3195480&start_issue_date=2021-05-01&end_issue_date=2021-05-31';

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

//レスポンスの中身を閲覧する
// Logger.log(response);

//JSONオブジェクトに変換
const jsonObj = JSON.parse(response);

//取引(収入/支出)の配列を取得する
const deals = jsonObj['deals'];

//全ての項目を2次元配列化する(サブ関数を使用)
const values = deals.map(deal => getFullArray_(deal)).flat();

//見出しを先頭に追加
const upperPropertyKeys = Object.keys(deals[0]);

const detailPropertyKeys = Object.keys(deals[0]['details'][0]);
const detailKeys = detailPropertyKeys.map(detailPropertyKey => 'details_' + detailPropertyKey);

const paymentPropertyKeys = Object.keys(deals[0]['payments'][0]);
const paymentKeys = paymentPropertyKeys.map(paymentPropertyKey => 'payments_' + paymentPropertyKey);

const headers = [...upperPropertyKeys, ...detailKeys, ...paymentKeys];
values.unshift(headers);

//スプレッドシートシートへ出力
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
sheet.clear();
sheet.getRange(1,1,values.length, values[0].length).setValues(values);

}

getMyDeals()を実行すると、このようにスプレッドシートに出力できていれば成功です。

まとめ

以上で、「取引(収入/支出)を取得しよう」 ということで、GETのおさらいと、レスポンスを受け取ったあとのデータの加工をお届けしました。

2次元配列の要素数を揃えるために、パズルを解くようなコーディングが発生しますが、条件分岐などを一つ一つクリアしていけば問題ありません。

また、今回はできるだけプロパティの値をベタ書きしないようにしましたが、deals[‘id’]や、deals[‘details’]のように、値を直接書いても問題ありません。

仕様変更があるさいは、会計freeeからもアナウンスが出ますので、ご安心ください。

次回は、「取引(収入/支出)を登録しよう」 をお届けします。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は6回目で 「取引を登録(収入/支出)しよう」 をお届けします。

前回のおさらい

前回は、「取引(収入/支出)を取得しよう」 ということで、GETのおさらいと、レスポンスを受け取ったあとのデータの加工をお届けしました。

[GAS][会計freee]取引(収入/支出)を取得しよう
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は5回目で 「取引を取得(収入/支出)しよう」 をお届けします。前回のおさらい前回は、「事業

今回は、「取引(収入/支出)を登録しよう」 をお届けします。

事前準備:勘定科目コードの確認

会計freeeでは、あらかじめ登録されている勘定科目コードがあります。

取引(収入/支出)には、必ず勘定科目コードが必要になりますので、勘定科目コードを確認する方法をご紹介します。

リクエストURL

リクエストURLは、エンドポイントに事業所IDを加えたものです。

"https://api.freee.co.jp/api/1/account_items?company_id='事業所ID'"

実行スクリプト

こちらをコピペで構いません。28行目の変数[name]に確認したい勘定科目名を入力して実行します。

/**
* 指定した勘定科目を取得する関数
*
* @param none
* @return none
*/
function getMyAccountItems() {

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();

//HTTPリクエストを送る時に必要なパラメーター
const params = {
method: "GET",
headers: { "Authorization": "Bearer " + accessToken }
};

//勘定科目一覧を取得するためのリクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/account_items?company_id=3195480';

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

//レスポンスをJSONオブジェクトに変換する
const accountItems = JSON.parse(response)['account_items']; //[{},{}]

//勘定科目コードを確認したい勘定科目を指定する
const name = '売上高'; //例 '前渡金','売掛金','買掛金','売上高','仕入高'

//JSONオブジェクトから、勘定科目を抽出する
const accountItem = accountItems.filter(accountItem => accountItem['name'] === name);

console.log(accountItem);

}

実行ログはこのようになります。メモしておきましょう。

取引(収入/支出)の登録

取引(収入/支出)は、一覧の取得と同様に、登録もできます。

「自動で経理」のさいに、手動でポチポチ登録をしましたが、今回はGASで自動化してみたいと思います。

「登録」をする時のHTTPリクエストの種類は「POST」です。

リファレンスの確認

[取引(収入/支出)の作成]をクリックします。

Parameters(パラメーター)は必要ありません。

リクエストURLの作成

リクエストURLを作成します。Partners(パラメーター)の[Try it out]をクリックします。

[Excute]をクリックします。

リクエストURLが生成されます。

リクエストボディの確認

POSTするためには、Request body(リクエストボディ)が必要です。

Parametersの[Model]をクリックします。

登録に必要なパラメーターを確認できます。アスタリスクがついている項目(プロパティ)は必須です。

[details]プロパティに含まれる項目を確認すると、中にも必須項目があります。

取引(収入/支出)の必須項目は6つ だけです。
– issue_date・・・発生日 (yyyy-mm-dd)
– type・・・収支区分 (収入: income, 支出: expense)
– company_id・・・事業所ID
– details・・・[]配列
– tax_code・・・税区分コード
– account_item_id・・・勘定科目ID
– amount・・・取引金額(税込で指定してください)

税区分コードはこちらから確認ください。

'税区分名':'税区分コード'
'課税売上10%:129'
'課税売上8%:101'
'課税売上8%(軽):156'
'課税売上:21'
'課対仕入10%:136'
'課対仕入8%(軽):163'
'課対仕入8%:108'
'課対仕入:34'
'対象外:2'
'不課税:20'
'非課売上:23'
'非課仕入:37'

必須項目は、会計freeeの取引登録画面で、同じような項目(プロパティ)を設定しますので、イメージがつながると思います。

Request body(リクエストボディ)の[Edit]をクリックします。

必要な項目(プロパティ)だけを残して、値を入力します。今回は必須項目のみにしました。

作成したリクエストボディは、後で使いますのでメモしておきます。

{
"issue_date": "2021-06-15", //取引の発生日
"type": "income", //収支区分
"company_id": '事業所ID', //事業所ID
"details": [
{
"tax_code": 101, //税区分コード
"account_item_id": 510450402, //勘定科目コード[売上高]
"amount": 1080, //税込取引金額
}
]
}

それではGASを書いていきます。

HTTPリクエストを送信

スクリプトエディタを開きます。スクリプトファイル「取引(収入/支出)の登録」を作成しておきましょう。

Payload(ペイロード)とは

「ペイロード」とは、元々運送に関する英単語です。

運送には、「お届け先」や「パイロット情報」などの、運送に必要な 情報 があります。

それ以外の、「乗客」や「貨物」を ペイロード と呼びます。

HTTP通信(リクエストもレスポンスも)も、通信の情報を詰め込んだ「ヘッダー」 と、データ本体である「ペイロード」 で構成されています。

POSTでは、リクエストボディをJSONにしたものがペイロードになります。リクエストボディをJSONに変換するメソッドはこちらです。

//オブジェクトをJSON文字列に変換する
JSON.stringify(object);

リクエストURLに送信するさいは、このようにparamsにペイロードを格納します。

//オブジェクトをJSON文字列に変換
const json = JSON.stringify(requestBody);

//paramsにペイロードを付与
const params = {
method: "POST", //GETではなく、POST
headers: { "Authorization": "Bearer " + accessToken },
contentType: "application/json", //ペイロードのデータ型を指定してあげる必要があります
payload: json
}

完成したコード

まとめると、このようなコードになります。

/**
* 取引(収入/支出)を登録する関数
*
* @param none
* @return none
*/
function setMyDeal() {

const requestBody = {
"issue_date": "2021-06-15",
"type": "income",
"company_id": 3195480,
"details": [
{
"tax_code": 101,
"account_item_id": 510450402,
"amount": 10800,
}
]
};

//オブジェクトをJSON文字列に変換
const json = JSON.stringify(requestBody);

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();

//paramsにペイロードを付与
const params = {
method: "POST", //GETではなく、POST
headers: { "Authorization": "Bearer " + accessToken },
contentType: "application/json", //ペイロードのデータ型を指定してあげる必要があります
payload: json
}

//取引(収入/支出)を登録するためのリクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/deals';

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

}

実行してみましょう。

取引の確認

会計freeeの[取引の一覧・登録]を確認(日付で検索すると早いです)すると、さきほど登録した取引が反映されています。

取引をクリックすると、詳細を入力できます。[取引先]や[品目]を入力して、データを管理していきましょう。(必須項目以外の登録の自動化は、文字数の都合上、省略いたします。)

まとめ

以上で、「取引(収入/支出)を登録しよう」 ということで、勘定科目コードの確認をして、ペイロードを作成しました。

最後にPOSTリクエストを送信して、会計freeeに反映されたことを確認しましたね。

次回は、最終回で、「残高確認表を作成しよう」 をお届けします。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は7回目で 「残高確認表を作成しよう」 をお届けします。

前回のおさらい

前回は、「取引(収入/支出)を登録しよう」 ということで、GASから取引を登録しました。

取引に不足している[取引先]などの情報は、手入力が必要ですが、いずれ自動化する方法をブログでご紹介したいと思います。

[GAS][会計freee]取引(収入/支出)を登録しよう
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は6回目で 「取引を登録(収入/支出)しよう」 をお届けします。前回のおさらい前回は、「取引

今回は、最終回で、「残高確認表を作成しよう」 をお届けします。

事前準備

取引先IDの確認:GAS

取引先IDを確認するために、[取引先一覧の取得]スクリプトファイルを作成します。

コードはこちらです。

/**
* 取引先IDを取得する関数
*
* @param none
* @return none
*/
function getMyPartner() {

//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();

//HTTPリクエストを送る時に必要なパラメーター
const params = {
method: "GET",
headers: { "Authorization": "Bearer " + accessToken }
};

//取引先一覧を取得するためのリクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/partners?company_id=事業所ID';

//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);

//レスポンスをJSONオブジェクトに変換する
const partners = JSON.parse(response)['partners']; //[{},{}]

//取引先IDを確認したい取引先名を指定する
const name = 'Kデザインオフィス'; //例 'いづみ企画','IMV株式会社','カ)アマナイメージズ'

//JSONオブジェクトから、取引先IDを抽出する
const partner = partners.filter(partner => partner['name'] === name);

console.log(partner);

}

取引先コードを確認したい取引先名を入力して、getMyPartner()を実行すると、取引先IDを確認できます。

取引先IDの確認:ブラウザ

取引先IDは、ブラウザでも確認できます。

[設定]をクリックして、[取引先の設定]をクリックします。

取引先の[編集]アイコンをクリックします。

URLに、取引先IDが含まれています。

https://secure.freee.co.jp/partners/{取引先ID}/edit

必要に応じて、スクリプトかブラウザから、取引先IDを確認してください。

スプレッドシートの確認

第4回目の「取引(収入/支出)を取得しよう」では、取引の一覧をスプレッドシートに出力しました。

[GAS][会計freee]取引(収入/支出)を取得しよう
どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は5回目で 「取引を取得(収入/支出)しよう」 をお届けします。前回のおさらい前回は、「事業

残高確認表とコンテナバインドスクリプトを開いて、作業開始です。

データの加工

取引一覧から、必要な取引先ごとのシート を作成するのが、今回のゴールです。

ライブラリの準備:SpreadsheetDateConverterToObject

表を見出し行で操作するために、以下のライブラリを使用します。スクリプトエディタにこちらのライブラリIDを追加してください。

スクリプトID:1s4kGJwF2eG-WGmeqgLWeqQtIBRAXUZbbh3fQ3f7QHvNywubO99nduFIY

このライブラリは、以下のような2次元配列を、

[ [ 'id', 'name', 'age', 'favorite', 'address' ],
[ 'tg001', 'Tsujike', 35, 'sushi', 'Hokkaido' ],
[ 'tg002', 'Etau', 37, 'coffee', 'Miyazaki' ],
[ 'tg003', 'Takahashi', 38, 'blog', 'Tokyo' ] ]

このような2次元配列に変換するものです。

[
{id:'id', name: 'name', age: 'age', favorite: 'favorite', address: 'address' },
{id:'tg001', name:'Tsujike',age:35,favorite:'salmon',address:'Hokkaido'},
{id:'tg002', name:'Etau',age:37,favorite:'coffee',address:'Miyazaki'},
{id:'tg003', name:'Takahashi',age:38,favorite:'blog',address:'Tokyo'}
]

使用するメソッドはこちらです。

//見出し行付きの2次元配列に変換するメソッド
const spreadsheetID = 'スプレッドシートID';
const sheetName = 'シート名';
SpreadsheetDateConverterToObject.getElementsArray(spreadsheetID, sheetName)

詳細はこちらのブログに掲載しています。

[ライブラリ][GAS][マニュアル]SpreadsheetDateConverterToObject ver1.2
2021年12月に、この記事(2次元配列を連想配列にするテクニック)に関する最新情報をブログにしました。どうも。つじけ(tsujikenzo)です。このシリーズでは 「共同編集者(自分も含め)にスプレッドシートの列を移動したり、追加削除され

スクリプトファイル「取引先別レポート出力」を追加します。

filter()メソッド

取引先IDのみ抽出するために、.filter()メソッドを使います。

取引先IDは数値型 なので気を付けましょう。

//必要な取引先IDのみ抽出する(行方向)
const partnerId = 36205797;
values = values.filter(value => value['partner_id'] === partnerId);

日付のソート

データは降順になっていますので、昇順に並べ返します。

//日付のソート
values = values.sort((a, b) => {

if (a[0] > b[0]) {
return 1;
} else {
return -1;
}
}

);

見出し行の処理

filter()メソッドを掛けると、見出し列が省かれますので、行方向の処理の前後で見出しを付け直します。

その際に、初期値行となる空行を挿入しておきましょう。

//見出しを格納しておく
const headers = values[0];

//行方向の処理

//初期値行の空行を挿入
values.unshift(new Array(headers.length));

//見出しを戻す
values.unshift(headers);

type「支出」をマイナスにする

残高を取るさいに、支出がある場合は、マイナスする必要があります。.map()メソッドで2次元配列を作り直しましょう。

//type「支出」をマイナスにする
values = values.map(value => {

if (value['type'] === 'expense') {
value['due_amount'] *= -1;
return value;
} else {
return value;
}

}
);

必要なフィールドのみ抽出する

残高確認を取るのに、すべてのフィールドは必要ありませんので、.map()メソッドで2次元配列を作り直します。

//必要なフィールドのみ抽出する(列方向)
values = values.map(value => {
return [
value['issue_date'],
value['type'],
value['partner_id'],
value['payments_from_walletable_id'],
value['due_amount'],
value['payments_amount']
]
}
);

スプレッドシートへ出力

あらかじめ新しいシートを作成し(今回は「シート2」にしました)、フィルター掛けした2次元配列を貼り付けます。

これまでのコードをつなげたものがこちらです。

/**
* 取引先別レポートを出力する関数
*
* @param none
* @return none
*/
function getReport() {

//空の2次元配列
let values = [[]];

//見出し行付きの2次元配列に変換するメソッド
const spreadsheetID = '1uIind-5VSSAfFYNi3t500nCCrw5pbctpzGoHelKJTEY';
const sheetName = 'シート1';
values = SpreadsheetDataConverterToObject.getElementsArray(spreadsheetID, sheetName);

//見出しを格納しておく
const headers = values[0];

//必要な取引先IDのみ抽出する(行方向)
const partnerId = 36205797;
values = values.filter(value => value['partner_id'] === partnerId);

//日付のソート
values = values.sort((a, b) => {

if (a[0] > b[0]) {
return 1;
} else {
return -1;
}
}

);

//初期値行を挿入
values.unshift(new Array(headers.length));

//見出しを戻す
values.unshift(headers);

//type「支出」をマイナスにする
values = values.map(value => {

if (value['type'] === 'expense') {
value['due_amount'] *= -1;
return value;
} else {
return value;
}

}
);

//必要なフィールドのみ抽出する(列方向)
values = values.map(value => {
return [
value['issue_date'],
value['type'],
value['partner_id'],
value['payments_from_walletable_id'],
value['due_amount'],
value['payments_amount']
]
}
);

//スプレッドシートへ出力
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');
sheet.clear();
sheet.getRange(1, 1, values.length, values[0].length).setValues(values);

}

スプレッドシートへ貼り付けされました。

スプレッドシートの整形

スプレッドシートを整形するための関数は別にします。setSheetView()としました。

引数として、sheetオブジェクト、繰越残高を[initial]として受け取ります。

[initial]にはデフォルト引数として、0を指定します。

function setSheetView(sheet, initial = 0) {
//処理
}

最終列の取得

最終列を取って、見出し「残高」を入力します。

//最終列の取得
const lastColumnNext = sheet.getLastColumn() + 1;

//見出しをつける
sheet.getRange(1, lastColumnNext).setValue('残高');

残高の初期値も設定しましょう。

//初期値を設定
sheet.getRange(2, lastColumnNext).setValue(initial);

式を入力

//式を入力
const values = sheet.getDataRange().getValues();

const newValues = values.map(value =&gt; {
value[lastColumnNext - 1] = `=R[-1]C[0] + R[0]C[-2] - R[0]C[-1]`;
return value;
}
);

//先頭2行を削除
values.shift();
values.shift();

//スプレッドシートの更新
sheet.getRange(3, 1, values.length, values[0].length).setValues(values);

最終的なコードはこちらです。

/**
* スプレッドシートを整形する関数
*
* @param {object} シートオブジェクト
* @param {number} 初期値(デフォルトは0)
* @return none
*/
function setSheetView(sheet, initial = 0) {

//最終列の取得
const lastColumnNext = sheet.getLastColumn() + 1;

//すでに残高列があったら処理を止める
const lastRowHeader = sheet.getRange(1, lastColumnNext - 1).getValue();
if (lastRowHeader === `残高`) return;

//見出しをつける
sheet.getRange(1, lastColumnNext).setValue('残高');

//初期値を設定
sheet.getRange(2, lastColumnNext).setValue(initial);

//式を入力
const values = sheet.getDataRange().getValues();

const newValues = values.map(value =&gt; {
value[lastColumnNext - 1] = `=R[-1]C[0] + R[0]C[-2] - R[0]C[-1]`;
return value;
}
);

//先頭2行を削除
values.shift();
values.shift();

//スプレッドシートの更新
sheet.getRange(3, 1, values.length, values[0].length).setValues(values);

}

スプレッドシートに式が入力され、残高が取れます。

後は、シートの見た目やPDFファイルとして保存する業務ですが、この連載では割愛いたします。

セルの書式設定はこちらのブログも参考にしていただければ幸いです。

[スプレッドシート]セルの書式設定は2次元配列の版画で
どうも。つじけ(tsujikenzo)です。今日は「スプレッドシートのセルの書式設定は2次元配列の版画で」というお話をします。「スプレッドシート」や「セルの書式設定」というのはよく聞きますが、「版画」というのは初めてかもしれません。とは言っ

まとめ

以上で、「残高確認表を作成しよう」 ということで、元になるデータから、必要な項目を抽出しました。

今回の連載で、すべての業務が自動化できたわけではありません。

しかしながら、今回は手入力とした以下のような項目は、将来的に自動化できます。
– すべての取引先IDを取得する
– すべての取引先シートを作成する
– 繰越残高を取得する
– PDFに出力して、メールで送信する
– 会計freeeの口座明細取得が[3日以内]になっているか確認する

また、別の連載を設けて、お届けできれば幸いです。

この連載の目次

[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう

Comments

Copied title and URL