OOMM
@OOMM (MM OO)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

GASでクラウド会計のデータを取得したいのですが、うまくいきません…

解決したいこと

GASを使用してマネーフォワードクラウド会計Plusのデータをスプレッドシートに取得したいのですがOAuth認証の時点でうまくいかずとても困っています。
無知すぎて一人では解決できず…どなたかご教授いただけないでしょうか?
Webで調べてもクラウド請求書のデータ取得方法は記事が多数あるのですが、クラウド会計についてはどこにもないので、そもそもできないのかな?とも思いだしております。。。泣

実行しているGASコード

※クライアントIDは ${ClientID} に書き変えてます

/**
 * 認証を行いアクセストークンをログ出力する
 */
function authorize() {
  const service = getMFInvoiceService_();
  const authorizationUrl = service.getAuthorizationUrl();
  const authorizationUrl2 = authorizationUrl.replace("client_id=${ClientID}&response_type=code&","response_type=code&client_id=${ClientID}&scope=mfc/admin/office.read&"); /** 認証先URLの並び順がおかしいので変更する */

  console.log(authorizationUrl3);
 /** ★ここで表示された認証先URLをWebでアクセスし、認証ボタンを押した後にエラーになってます… */
}

/**
 * 指定した名前で新しいMFクラウド請求書のサービスを作成する
 */
function getMFInvoiceService_() {
  
  const serviceName = 'mfInvoice';
  const authorizationBaseUrl = 'https://api.biz.moneyforward.com/authorize';
  const tokenUrl = 'https://api.biz.moneyforward.com/token';
  
  const properties = PropertiesService.getScriptProperties();
  const clientId = properties.getProperty('CLIENT_ID');
  const clientSecret = properties.getProperty('CLIENT_SECRET');
  
  return OAuth2.createService(serviceName) 
      .setAuthorizationBaseUrl(authorizationBaseUrl)
      .setTokenUrl(tokenUrl)
      .setClientId(clientId)
      .setClientSecret(clientSecret) 
      .setCallbackFunction('authCallback_')
      .setPropertyStore(PropertiesService.getUserProperties())

}


/**
 * OAuth認証の処理終了時に呼び出される関数、認証の成否をWebページとして表示する
 */
function authCallback_(request) {
  const service = getMFInvoiceService_();
  const isAuthorized = service.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  }
}

自分で試したこと・発生しているエラー

1:クラウド請求書のAPI連携で参考にさせて頂いているサイト(https://tonari-it.com/moneyforward-invoice-api-test/)
を元にOAuth認証用のGASコードを作成して実行しました。

2:OAuth認証URL(コードの★の所)でエラー
.getAuthorizationUrl()で取得したURLのままではどうしてもアクセス時にエラーになってログイン画面がでなかったので、.replace関数を使用してマネーフォワード公式のアクセスURLを元に認証URLを並び替えてみたら、ログイン画面がでたのでそのままアクセスしました(これをしないとどうにもアクセス出来ませんでした‥‥)
マネーフォワード公式チュートリアル:
https://developers.biz.moneyforward.com/docs/tutorial/step-1/

3:認証後、以下のエラーが表示されます。
エラー.jpg

※GASのプロパティにはCLIENT_SECRETが入力されており、「const clientSecret = properties.getProperty('CLIENT_SECRET');」で問題なく取得出来ていることをログ出力で確認ずみです。

やはり、.getAuthorizationUrl()で取得したURLを書き換えてるからダメなのでしょうか?でも書き換えないとアクセス画面もでなくて…💦
どなたかご教授いただけますと助かります。。😭

1

1Answer

OAuth認証URL(コードの★の所)

コードの文字列からURLのパラメータに見えましたが、もしそうであれば、並び順に意味は無いはずです。
keyword=valueの形式を&でつなげているだけで、受信側はkeywordでパラメタを判断して、普通は順番など気にしないはずです。

並び替えの他に、scope=mfc/admin/office.readのパラメタを付加しています?

元のauthorizationUrlの値を見たい気がしますが、お力になれるかは?です。

1Like

Comments

  1. @OOMM

    Questioner

    @nak435さん
    コメントありがとうございます!少しでもみて頂けるととても助かります!
    並び順は意味無いのですかね…💦

    >並び替えの他に、scope=mfc/admin/office.readのパラメタを付加しています?
    →そうなんです!クラウドワークスの公式ガイドでscope=mfc/admin/office.readのパラメタを付加する、となっていて
    return OAuth2.createService(serviceName)にscope=mfc/admin/office.readを設定していたのですが、authorizationUrlの値として取得した時に文字化けしてしまい、そのURLでアクセスしても同じくエラー画面になってしまい…
    色々と試行錯誤し、最終的に質問に記載のコードでreplaceで置換し+scopeの値も付与してログイン画面は表示出来た、という感じです💦
    scope.png

    元のauthorizationUrlの値は以下になります。
    https://api.biz.moneyforward.com/authorize?client_id=${ClientID}&response_type=code&redirect_uri=https%3A%2F%2Fscript.google.com%2Fmacros%2Fd%2F1BvbIqNx63x7ve_GbftCbT3ZsGjikc8HkFDOKfiFz33OAy0fcq1fqFolu%2Fusercallback&state=ADEpC8wTBAhisY2IgjOU2Tx16fJTGZcLtD2Qd3BhYN0HNE1S4-89nb-4NvbTMsU2KcC6VRQSJo5wD8OroqdN0REnGJL7JK-sTpMvYPxQCUkdZGnGkv9v5PnI4Ta2f2kUCmmHq1DkElRr67KI0hrA1qGKMlGnN83BQRNqPy5D0XFMsXEa54_BBMt6u2OAjkpyZe9PVw4B7Idi0CpULdRhfIktYhT24CyZIfMQAAruJNeO7UkJFRPcsHZpOb1puGMu8ThaOhuVUcsgw7YysyYD37fe-I_y71d_CpYlaBp7cBYkoSiBxs77TW8

    このURLをWebブラウザで表示させようとすると、以下の画面表示になります。
    ①元の値でアクセスしたときの画面表示.png

    replaceで並び替えた後のauthorizationUrlの値は以下で、
    https://api.biz.moneyforward.com/authorize?response_type=code&client_id=${ClientID}&scope=mfc/admin/office.read&redirect_uri=https%3A%2F%2Fscript.google.com%2Fmacros%2Fd%2F1BvbIqNx63x7ve_GbftCbT3ZsGjikc8HkFDOKfiFz33OAy0fcq1fqFolu%2Fusercallback&state=ADEpC8yTOPQjXpSTGlKBe0t9W__ZAlyqWgar-uz3aym9OCr92yp5bxW714PEFDxWWFfTDP4UrAYLeWGHhKavtXhde_TRNP0yJsj3eQFxXU6T9M5Ln43s3cZwGixi-bfo-15GMhtHkbL6NR-8zy82ZuUCSsT4RfgBxbtvZZTrpGuSPABQQm5HQ8vNdccS3M74n1uJNF4IPcpZfv19KvjsM0b3YnPy202xxBSyfyLDuIDj0Pm4z64D_G9q0QDmMYP93oyaU_TgdimUNV6CfBV4Y1xOJRzhG1CATtkhzMgmL0y6HmyghRzLCmw

    こちらのURLで表示させると以下のようなログイン画面になって、ログインはできるようになります。
    ②並び替え後のアクセス後画面表示.png

    説明下手で申し訳ありません💦
    お手数をお掛けして申し訳ないのですが、ご確認よろしくお願いいたします…😭

  2. 元のauthorizationUrlの値は以下になります。
    replaceで並び替えた後のauthorizationUrlの値は以下で

    上の2つをよく見比べると、
    ①並びが違う(当たり前)、②scope=mfc/admin/office.readのパラメタを付加した、③stateパラメタの内容が違う。
    ③は取得したタイミングが違うから発生しているのでしょうか?


    単に`scope=mfc/admin/office.readのパラメタを付加する`だけなら、下記でよいと思いますが、 `return`していないし、`authorize()`を呼ぶ側もいないので腑に落ちません。
    function authorize() {
      const authorizationUrl = service.getAuthorizationUrl();
      const authorizationUrl2 = authorizationUrl + "&scope=mfc/admin/office.read";
      return ??? 
    }
    

    ちなみに、redirect_uri は↓これで正しいのでしょうか? (STEP1で設定したリダレクトURI ?) `https://script.google.com/macros/d/1BvbIqNx63x7ve_GbftCbT3ZsGjikc8HkFDOKfiFz33OAy0fcq1fqFolu/usercallback`
  3. @OOMM

    Questioner

    @nak435さん
    お返事が遅くなり申し訳ありません。ご確認ありがとうございます!
    ご掲示いただいた+でパラメタ付与する方法を試したら、エラーにはなりましたがログイン画面はでました!
    並び順や文字化けのせいとばかり思っていたのですが、それは関係ないのだということが分かり、色々と試したところうまく動作するようになりました!😭

    実施したことは、return OAuth2.createService(serviceName) の中に「setScope('mfc/admin/office.read');」を追加→ここでログイン画面はでましたが、質問事項と同じく「Error retrieving token: invalid_client, …」のエラーになったので
    マネーフォワードのアプリ情報の中を確認し、「クライアント認証方式」を「CLIENT_SECRET_BASIC」から「CLIENT_SECRET_POST」に変更するとエラーにならずに希望の画面に遷移できました。

    1人で悩んでいたら解決できなかったと思います!助かりました!!
    貴重なお時間をいただき本当にありがとうございました!!🙇‍♀

  4. 解決してよかったです✌️

    よろしければ、当Q&Aをクローズしてください。

  5. @OOMM

    Questioner

    ※追記
    あれからやっぱりデータをうまく取得できなかったのでマネーフォワードサポートに問い合わせたところ
    クラウド会計PlusのAPIを利用する場合はスコープの値を「mfc/enterprise-accounting/report.read」にする必要がある、とのことで
    スコープを変更したらやっとうまく取得できました。念のため追記しておきます。

  6. フィードバックありがとうございます。

Your answer might help someone💌