質問者のコードを整形
コードブロックの設定に失敗しており読みづらいので整形します
// APIのURLを組み立てる
const apiUrl = `https://api.houjin-bangou.nta.go.jp/4/name?id=******&name=${encodedCompanyName}&change=1&type=01`
const { body, status } = await new Promise((resolve, reject) => {
kintone.proxy(apiUrl, 'GET', {}, {}, (body, status, headers) => {
// バイナリデータをUint8Arrayに変換
const uint8Array = new Uint8Array([...body].map(c => c.charCodeAt(0)));
// Shift-JISでデコード
const decoder = new TextDecoder('shift-jis');
const decodedBody = decoder.decode(uint8Array);
resolve({ body: decodedBody, status });
}, (error) => {
reject(error);
});
});
encoding.jsを使ってみる
うまくいきませんでした。
回避策
法人番号APIの仕様
https://www.houjin-bangou.nta.go.jp/pc/webapi/images/k-web-api-kinou-gaiyo.pdf#page=25
を参考にAPIにアクセスをするURLのtypeを01(CSV/Shift-JIS)から02(CSV/UNICODE)か12(XML/UNICODE)に変更してUNICODEで受け取るようにしてください。
XMLの方が受け取った情報を処理しやすいと思います。
どうしてもShift-JISで処理したい場合は、kintone内にいったん取り込んでから文字コードを変換して対応する必要がありそうです。
外部のAPIを実行する - cybozu developer network
には記載がないようですが、外部APIからのデータ返却の文字コードがShift-JISなどのutf8以外だと無条件にデータ変換か何かが行われデータが壊れてしまうようです。
たとえば、kintone.proxy()が関連しないGoogle App Scriptでは
type 01のShift-JISで問題なく受け取れます。
function getCorporatenumber() {
'use strict'
const appId = '';
const encodedCompanyName = encodeURIComponent("一代元")
const url = `https://api.houjin-bangou.nta.go.jp/4/name?id=${appId}&name=${encodedCompanyName}&mode=1&type=01`;
const response = UrlFetchApp.fetch(url).getContentText("Shift-JIS")
console.log(response)
}
もし、kintone.proxy()が文字コードを変換しているのであれば、Shift-JISに直せばいいのではないか?と考えました。
しかし、うまくいかず
Encoding.stringToCode()
の時点で
[72, 101, 108, 108, 111, 32, 65533, 111, 65533, 974, 89, 65533, 399, 65533, 33]
のように65533が含まれており、Unicodeの置換文字になっており直せませんでした。