Community

コミュニティをご利用の際は 【ガイドライン】を確認・同意いただいた上でご利用ください。

  • 投稿

    アバターKazuki Uwai

    取引PUTリクエストの際のarrayの処理について

    現在、信憑の添付されていない取引にドライブ上から画像を探して見つかったものをfreeeにアップロード、取引の更新で画像を添付するスクリプトを作成しようとしています。
    取引でPUTリクエストを行う際の、JSONでのArrayの取り扱いでご質問させていただきたいです。

    下部コードにあるdetailsとreceipt_idsがArrayでの受け渡しになるのですが、GASの仕様上UrlFetchApp.fetchした際にArrayはObjectとして扱われるようで

    {errors=[{messages=[receipt_ids は Array で指定してください。], type=validation}], status_code=400.0}

    というようなエラーが出てしまいます。そこでこちらの記事の通り、Arrayとして渡すにはcontentType: application/JSONと指定するか、JSON.stringify(body)をすれば良いようなのですが、こちらの記事でそれらの方法がfreee APIでは適さないという記載があり解決方法がみつかりません。もし解決方法をご存知の方がいらっしゃればご教授いただきたいです。

    以下コードです。

    function renewDeal() {
    const dataObj = getDeals();
    const id = dataObj.id;
    const receiptId = dataObj.receiptId;
    const issue_date = dataObj.issue_date;
    const type = dataObj.type;
    const details = dataObj.details;

    const receipt_ids = new Array(receiptId);

    const requestUrl = https://api.freee.co.jp/api/1/deals/${id};

    const body = {
    issue_date: issue_date,
    type: type,
    //company_id: company_id,
    details: details,
    receipt_ids: receipt_ids,
    };

    const option = {
    method: “put”,
    headers: { Authorization: “Bearer ” + accessToken },
    payload: JSON.stringify(body),
    muteHttpExceptions: true,
    };

    let response = UrlFetchApp.fetch(requestUrl, option);
    response = JSON.parse(response);
    Logger.log(response);
    }

    回答

    アバターyakumo

    GAS は型だったりでハマった記憶ありますね。
    型以外にもなにかあったような…。

    ちょっと今思い出せない & 検証環境つくれないのでアドバイスどまりですが。
    JSON.stringfy した文字列のパラメータが適当な構造をしているか見てみるのが良いかと思います。

    そのさいコンテキストによって int/float とかが異なる見栄えになるケースがあった気がします。
    そこらへんもご注意ください。

    アバターKazuki Uwai

    yakumoさん

    アドバイスありがとうございます
    ご指摘の通り内容の確認とfreee会計リファレンスでそのJSON自体をテストしてみたところちゃんと問題なく処理されるのですが、やはりgasかJSON.stringify()したものを用いてfetchすると正しく取得できないようです
    方自体も特に問題はないようでしたので別の解決策をまた探してみます。
    ありがとうございます。

    アバターyakumo

    念の為の確認なのですが。

    > ご指摘の通り内容の確認とfreee会計リファレンスでそのJSON自体をテストしてみたところちゃんと問題なく処理されるのですが、やはりgasかJSON.stringify()したものを用いてfetchすると正しく取得できないようです

    JSON.stringify() された結果をfreee会計リファレンスの機能で送信していますか?
    また、header には application/json の指定もされてますか?

    実際に GAS 経由で送られたリクエストの確認方法を調べて、ヘッダー含めて確認すると通るリクエストとの差異が見えてくる気がしました。

    アバターKazuki Uwai

    ありがとうございます。

    >JSON.stringify() された結果をfreee会計リファレンスの機能で送信していますか?

    はい。会計リファレンスAPIのTryItOutから実際にJSON.stringifyで生成されたものをコピペして通ることを確認しました。

    >また、header には application/json の指定もされてますか?

    いいえ。他の記事での回答でfreee APIはmultipart/data-formで扱う旨が書かれていたのでheaderで特に指定はかけていません。

    >実際に GAS 経由で送られたリクエストの確認方法を調べて、ヘッダー含めて確認すると通るリクエストとの差異が見えてくる気がしました。

    おっしゃる通り確かにそこの確認を怠っていました。急ぎ調べてみます。

    ありがとうございます。