【GAS】Google Apps Scriptでマネーフォワードクラウドの請求書を毎月自動発行【②認証篇】

【追記】
この記事のプログラムは2022年時点でのMFクラウド請求書API(v2)を使用しています。
2023年9月30日でv2の提供終了が発表されました。
連載記事を全てお読みいただいた後に、
以下の記事を参考にv3への移行をお願いいたします。

※GASカテゴリー全記事はこちら

こんにちは~!

大変お待たせいたしました!前回の続きで、GASマネーフォワードの連携をやっていきます!

前回の記事はこちら↓

今回は第2回ということで、認証手順をまとめていきます!

APIを知っている人が誰でもアクセスできる状態というのはセキュリティ的にまずいですよね?

それを避けるため、前回準備した「Client ID」と「Client Secret」を使って、
GASからアクセスできる環境を整えていきましょう!

OAuth2ライブラリの追加

まず、Googleドライブを開き、前回作成したGASを開いてください。

前回も触れましたが、クラシックエディタで開いてください!

新しいエディタになっている人は、「クラシックエディタを使用する」をクリックしておきましょう!

クラシックエディタが開けたら、「リソース」→「ライブラリ」をクリックします。

ダイアログ下部の「Add a library」に下記文字列をコピペし、「追加」をクリックしてください。

1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

追加すると、「OAuth2」という行が追加されます。

これが認証を自動化してくれる便利なライブラリなんだな~ぐらいに思っておいてください。

「バージョン」をクリックし、最も新しいバージョンを選択して、「保存」をクリックしてください。

Client ID」と「Client Secret」の登録

次に、前回作成した「Client ID」と「Client Secret」を登録していきましょう!

「ファイル」→「プロジェクトのプロパティ」をクリックします。

あ、1つお伝えし忘れていたことがありました!

ここで「情報」タブに表示されている「タイムゾーン」が合っているかを確認しておいてくださいね!

私はここが日本時間になっておらず、
プログラムで日付計算をしているときに時差でおかしなことになっていました^^;

話を戻し、「スクリプトのプロパティ」タブをクリックしてください。

「+行を追加」をクリックし、下記の通り入力してください。

  • プロパティ:「CLIENT_ID」、値:前回作成したClient ID
  • プロパティ:「CLIENT_SECRET」、値:前回作成したClient Secret

コピペができたら、「保存」をクリックしましょう。

認証用プログラムの作成

ここからは、いよいよGASにコードを書いていきます!

コードはコピペでOKですので、どんどんやっていきましょう!

まず、認証を行う関数を下記の通り書いてください。

function auth() {
  // 認証用URLを取得しコンソールに出力
  console.log(getService_().getAuthorizationUrl());
}

サービスを作成し、認証用URLを取得し出力しています。

次に、上記で呼び出しているサービス作成関数「getService_()」を下記の通り書いてください。
※関数名の末尾にアンダーバーを付けるとプライベート関数になります

function getService_() {
  // スクリプトのプロパティを取得
  const PROPERTIES = PropertiesService.getScriptProperties();

  // 指定した名前でサービスを作成(名前は何でもOK)
  return OAuth2.createService('moneyforward')
    .setAuthorizationBaseUrl('https://invoice.moneyforward.com/oauth/authorize')
    .setTokenUrl('https://invoice.moneyforward.com/oauth/token')
    .setClientId(PROPERTIES.getProperty('CLIENT_ID'))
    .setClientSecret(PROPERTIES.getProperty('CLIENT_SECRET'))
    .setCallbackFunction('callback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope('write');
}

先程設定したスクリプトプロパティを取得し、サービスを作成しています。

認証情報はユーザープロパティに格納され、そのユーザーはアクセスできるようになる仕組みです。

注意点として、「Client ID」と「Client Secret」はとても大事な情報です!

直書きしてしまうとセキュリティ的に良くないので、
プロパティに設定し、取得するようにしましょう。

そして、上記「getService_()」の「.setCallbackFunction」に「callback」と書いていますよね?

これがサービス作成後に呼び出される「コールバック関数」の名前となります!

というわけで、「callback()」を下記の通り書いてください。

function callback(request) {
  return HtmlService.createHtmlOutput(getService_().handleCallback(request) ?
    '認証OK!このタブを閉じてください。' : '認証NG!原因を調査してください。このタブを閉じてください。');
}

「HtmlService.createHtmlOutput」は、引数に応じてHTMLページを生成します。

「getService_().handleCallback(request)」により、認証リクエストの成否が分かります。

これらを実行すると、何が起こるのでしょうか?

コードを実行

それでは、いよいよプログラムを実行してみましょう!

「実行」→「関数を実行」→「auth」をクリックしてください。

少し待つと実行が終わるので、「表示」→「ログ」をクリックしてください。

すると、下図のように長いURLが出力されているかと思います。これが認証用URLです!

これを「Ctrl」+「C」(Macの方は「Command」+「C」)でコピーし、
ブラウザに貼り付けて、開いてみてください。

すると、マネーフォワードクラウドが開き、「アプリケーションの承認」画面が表示されます。

そのまま「許可」をクリックしてください。

画面遷移し、先程「callback()」で指定した文字列が表示されたWebページが表示されます。

無事認証に成功していれば、「認証OK!」の方の文字列が表示されているはずです。

ここまでできていれば、認証作業完了です!お疲れ様でした!

補足:アクセストークンとリフレッシュトークンについて

ここからは補足です。

マネーフォワードクラウド請求書が提供している公式マニュアルには、
アクセストークン」「リフレッシュトークン」についての記載があります。

アクセストークンは今回のプログラムで取得し、ユーザープロパティに格納しています。
※先程「認証情報」と書いていたものがアクセストークン

しかし、実はこのアクセストークン、30日の有効期限があるのです!

マニュアルには、有効期限が切れたら、同時に発行しているリフレッシュトークンを使って云々…。

あれ?そんなことプログラムには書いてないよね?

そうなんです。

実は、このリフレッシュトークンでアクセストークンを再発行する処理も、
全部OAuth2ライブラリが代わりにやってくれているんです!!

OAuth2ライブラリさん、めっちゃ優秀じゃないですか?

こんな面倒になりそうな例外処理を書かなくて済むなんて。。。

というわけで、以上、「アクセストークン」「リフレッシュトークン」なんて単語を理解しなくても、
システム間連携がサクッとできちゃう偉大なOAuth2ライブラリさんの紹介でした。

終わりに

最後までお読みいただきありがとうございました!

漸く、GAS(Google Apps Script)とマネーフォワードクラウド請求書が繋がりましたね!

次回は、実際にAPIを使って、請求書データを取得していきます!お楽しみに!!