GAS x マネーフォワードクラウドのAPIを使って請求書作成を自動化する方法②(認証編)

投稿日: 2024-08-10

業務効率化

エンジニアリング

マネーフォワードクラウドのAPIによる請求書作成の自動化を引き続き進めていきましょう。

前回の振り返りと今回やっていくこと

前回までで、GASの準備とマネーフォワードクラウドのAPIの利用設定が完了しました。

前回の記事を確認したい方はこちら

https://maeshiiii.com/posts/automated-billing-1

今回はこの設定を利用して、GASでマネーフォワードクラウドのAPIの認証をしていきます。

請求書情報を取得するためには、まず認証を済ませる必要があるので、そのコーディングおよび設定を行っていきましょう。

今回やっていくこと

まず今回の記事でやっていくことは、以下の2点です。

  • GASからマネーフォワードクラウドAPIへの認証処理を実行する。
  • 認証をマネーフォワードクラウドのアプリで許可する。

Frame_3688.png

「Client ID」と「Client Secret」の設定

前回の記事で、マネーフォワードクラウドアプリに登録した時に発行された「Client ID」と「Client Secret」をGASに設定します。

※マネーフォワードクラウドアプリを閉じてしまった人は、こちらからアクセスして、登録したアプリをクリックすると「Client ID」と「Client Secret」を確認できます。

  1. Apps Scriptの左側メニュー「プロジェクトの設定」をクリックする。

  2. 「スクリプトプロパティを追加」をクリックする。

    Untitled.png

  3. プロパティをCLIENT_ID と記入して、値にマネーフォワードクラウドアプリに書かれている「Client ID」をコピー&ペーストする。

  4. 同様に、「スクリプトプロパティを追加」して、プロパティをCLIENT_SECRET と記入して、値にマネーフォワードクラウドアプリに書かれている「Client Secret」をコピー&ペーストする。

    Untitled.png

  5. 2つのプロパティを設定できたら、「スクリプトプロパティを保存」をクリックする。

  6. Apps Scriptの左側メニュー「エディタ」に戻って、以下のコードを貼り付けてください。

    function getScriptProperties_() { const PROPERTIES = PropertiesService.getScriptProperties(); return { CLIENT_ID: PROPERTIES.getProperty('CLIENT_ID'), CLIENT_SECRET: PROPERTIES.getProperty('CLIENT_SECRET'), }; }

これで「Client ID」と「Client Secret」の設定は完了です。

【補足】上記スクリプトプロパティとコードの解説

手順とは関係ありませんが、どのようなことを実施したのかの解説をします。

興味がある方のみ読んでください。

スクリプトプロパティとは

スクリプトプロパティは、GASのプロジェクト全体で使える設定や値を保存しておく場所として利用されます。データベースや他の外部システムを使わずに、キーと値のペア形式でデータを保存できます。

APIキーや認証トークンなどの機密情報を直接コードに書いてしまうと、そのコードを見た人全員がその機密情報にアクセスできてしまいます。これは特に、複数人が共同作業を行う場合や、コードを公開する場合に危険です。スクリプトプロパティを使うことで、機密情報をコードから分離し、コード内に露出しないようにできます。

よって今回は、スクリプトプロパティを使っています。

コードの解説

以下のように書くことで、スクリプトプロパティに登録した値を取得することができます。

const PROPERTIES = PropertiesService.getScriptProperties(); const crientId = PROPERTIES.getProperty('CLIENT_ID') console.log(crientId) // スクリプトプロパティ「CLIENT_ID」の値が出力される

今回はgetScriptProperties_() という関数の中で、スクリプトプロパティを取得し、連想配列を返すようにすることで、スクリプトプロパティの取得する処理を1つにまとめています。

なお、関数名の末尾にアンダーバーを付けるとプライベートな関数になり、他の関数から呼び出されるものという扱いになります。そのため、GASの関数を実行するドロップダウンの中には表示されなくなります。

Untitled.png

今回はstart()という関数以外は全てプライベート関数にしています。

OAuth2ライブラリの追加

次は、GASにOAuth2というライブラリを追加しましょう。

  1. エディタのメニュー「ライブラリ」をクリックする。
  2. 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF という文字列をスクリプトIDに貼り付けて、「検索」をクリックする。
  3. 画像のように「OAuth2」と表示されたら「追加」をクリックする。
    1. バージョンは最新の番号を選べばOK

Untitled.png

これで、OAuth2ライブラリの追加は完了です。

【補足】OAuth2とは

OAuth2は、インターネット上で安全にリソースにアクセスするための標準的な認可フレームワークです。ユーザーのパスワードなどの機密情報を共有せずに、第三者がユーザーのデータにアクセスできるようにするための仕組みを提供します。

このOAuth2という仕組みがライブラリとして提供されており、これを利用することで簡単に認証をすることができます。

認証に必要な処理のコーディング

次は認証に必要な処理のコーディングをしていきましょう。

すでに書かれているコードの下に、以下のコードを全て貼り付けてください。

function start() { try { auth_(); } catch (error) { logError('請求書の自動作成にエラーが発生しました。:', error); } } function auth_() { try { Logger.log(getService_().getAuthorizationUrl()); } catch (error) { logError('Error in auth_ function', error); throw error; } } function getService_() { try { const PROPERTIES = getScriptProperties_(); return OAuth2.createService('moneyforward') .setAuthorizationBaseUrl('https://api.biz.moneyforward.com/authorize') .setTokenUrl('https://api.biz.moneyforward.com/token') .setClientId(PROPERTIES.CLIENT_ID) .setClientSecret(PROPERTIES.CLIENT_SECRET) .setCallbackFunction('callback_') .setPropertyStore(PropertiesService.getUserProperties()) .setScope('mfc/invoice/data.write'); } catch (error) { logError('Error in getService_ function', error); throw error; } } function callback_(request) { try { return HtmlService.createHtmlOutput(getService_().handleCallback(request) ? '認証OK!このタブを閉じてください。' : '認証NG!原因を調査してください。このタブを閉じてください。'); } catch (error) { logError('Error in callback_ function', error); } }
【補足】上記コードの解説

start()

start() を呼び出すことで、認証の処理がスタートします。

今は認証用のauth_()を呼び出しているだけですが、後ほど様々な処理が追加されていきます。

auth_()

auth_()内は、getService_() を呼び出し、作成された認証用URLを出力しています。

getService_()

スクリプトプロパティに設定した「Client ID」と「Client Secret」を利用するために取得します。その値を使ってマネーフォワードクラウドAPIに認証し、サービスを作成しています。

setCallbackFunction('callback_') と記載することで、このサービス作成が終わった後に、callback_ という名前の関数を呼び出すようにしています。

callback_(request)

認証がうまく行った場合は、ブラウザに「認証OK!このタブを閉じてください。」と表示されるようにしており、認証がうまくいかなかった場合は、「認証NG!原因を調査してください。このタブを閉じてください。」と表示されるようにしています。

これにより、認証の可否を判断しやすくなります。

Try ~ Catch

各関数にはTry ~ Catchを入れています。これによりエラーなどの例外が発生した場合は、出力をするようにしています。最終的には請求書の作成に失敗したことをSlackに通知する予定です。

コードを実行して認証を行う

それでは、実際にコードを実行して認証を行ってみましょう。

  1. 「▷実行」をクリックする。

    Untitled.png

  2. コンソールに出力されたURLをコピーする。(赤枠全てが1つのURLです。)

    Untitled.png

  3. URLをブラウザのURLバーに貼り付けてEnterキーを押す。

  4. アカウントを選択して、事業者の選択も「次へ」をクリックする。

    Untitled.png

  5. 「許可」をクリックする。

    Untitled.png

  6. ブラウザに「認証OK!このタブを閉じてください。」と出るので、ブラウザを閉じる。

    Untitled.png

これで認証も完了です!ここまでお疲れ様でした!

次回の記事では、いよいよ請求書の作成に入っていきます。

https://maeshiiii.com/posts/automated-billing-3

←ホームに戻る