JavaScript実行時のエラーについて

Aアプリのボタンを押下した際に、キーとなる番号でBアプリのレコードを検索。
検索出来たレコードの項目に対して、Aアプリの項目で上書きしようと思っています。
コードを作成し、実行したところ以下のようなメッセージが表示されました。
エラー
カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。

  • event.record[‘リッチエディター’] が不正です。
  • event.record[‘最新活動日’] が不正です。
  • event.record[‘ドロップダウン’] が不正です。
  • event.record[‘ルックアップ01’] が不正です。
  • event.record[‘リッチエディター_1’] が不正です。
  • event.record[‘チェックボックス’] が不正です。
  • event.record[‘ルックアップ01_1’] が不正です。
  • event.record[‘ルックアップ_1’] が不正です。
  • event.record[‘ルックアップ’] が不正です。

実装しているコードはいかのものです。
(() => {

'use strict';

kintone.events.on(['app.record.edit.show'], event => {
 const record = event.record;
	const space = kintone.app.record.getSpaceElement('target-space');
	const button = document.createElement('button');
	button.textContent = 'Prospectに反映';
	space.appendChild(button);

	button.addEventListener('click', () => {
        let PNo = '';
        let InterviewDate = '';
		const current = kintone.app.record.get();
        if (current) {
            PNo = current.record.P_No.value;
            InterviewDate = current.record.面談日.value;
          }
          const url = kintone.api.url('/k/v1/record.json', true);
          const APP_ID = 57;
          const body = {
            app:APP_ID,
            id:PNo,
          };
          kintone.api(
            url,
            'GET',
            body,
            (resp) =>{
               resp.record['最新活動日'].value = InterviewDate;
               kintone.app.record.set(resp);
            }
          )

	});

	return event;

});

})()
更新する側のアプリの設定など、関係あるのでしょうか?お手数ですが、ご教授頂けますでしょうか。

        (resp) =>{
           resp.record['最新活動日'].value = InterviewDate;
           kintone.app.record.set(resp);
        }

ここの部分が怪しそうですね、REST APIでとってきた他のアプリのデータをそのまま利用せず、必要な部分だけちゃんと上書きした書き方にしてみるとどうでしょうか。
RESTAPIでとれるデータとJS API(kintoe.app.record.getなど)からとれるデータは若干型が違いますので。
(問題の切り分けとして、少しのフィールドで試すとらくだとおもいます)

1 Like

@mura
アドバイスありがとうございます。
以下のように変更してみました(すいません、確認の為のconsloe.logが入っています・・・)
(resp) => {
// 成功時のコールバック関数
console.log(resp);
if (resp) {
new_update = InterviewDate;
}
resp.record.最新活動日 = new_update
console.log(resp);
return event;
}
)
kintone.api(kintone.api.url(“/k/v1/record”, true), “PUT”, {
app: APP_ID,
id:PNo,
record: { 最新活動日: {new_update } },
});

          return event;

	});

	return event;

});

})()
エラーは出なくなり、データの取得も出来ているようなのですが、目的であるBアプリへの反映がされていません。何か足りない部分がありますでしょうか?ちなみに、反映はされていないのですが、Bアプリのレコード更新日時は更新される為、処理は動いていそうです。
お手数ですが、アドバイス頂けますと助かります。

@h-moto さん

こんにちは、横槍申し訳ないです。
まず思ったのが、最初の質問の意図としてAアプリのボタンを押したときに、Bアプリでキー(恐らくAアプリのP_No)となるアプリを探してBアプリをAアプリの内容で更新したいのに、開いているレコードを更新する「kintone.app.record.set()」ではBアプリを更新できないところですね。

修正後のコードを見ると、RestApiのPUTメソッドでされたいのは、APP番号が「57」、レコード番号が「AレコードのP_No」のBアプリのレコードの最終更新日フィールドに値を入れたいとお見受けしました。
恐らくですが、レコード編集イベントを作動されたと時にデバッグコンソールにエラーでていませんか?
PUT時のリクエストボディの配列が少し間違っておりますので…
下記のようにすればできるかなと思われます。

kintone.api(kintone.api.url(“/k/v1/record”, true), “PUT”, {
app: APP_ID,
id:PNo,
record: { 最新活動日: {value:new_update } },
});
1 Like

@y_minamitani9534
ご指摘ありがとうございます。
そもそもで何をしたいかが分からないですよね。申し訳ございません。
やりたい事としては、
①Aアプリのボタン押下時に、Aアプリのレコード内容取得。
②取得したレコード内容の中の【P-No】をキーにして、Bアプリのレコードを取得
③②で取得したBアプリのレコードにある【最新活動日】を①で取得している内容で更新
になります。
ご提示頂いたコードで更新してみましたが、状況は変わりませんでした(レコード更新日付だけ更新される)
元々、私がやろうとしている内容が伝わっていなかった事もあるかと思います。
お手数ですが、再度ご確認頂けますと助かります。

ちなみに、P_NoはBアプリの更新したいレコード番号なのでしょうか?
それとも、違うフィールドなのでしょうか?

もしレコード番号ならば、上記の形で問題ないかと思われますので、
デバッグツールを使ってなぜうまくいっていないのか把握されたほうがいいかと思われます。
参考リンク:https://cybozudev.zendesk.com/hc/ja/articles/4977994758297-kintone-JavaScript-カスタマイズデバッグまとめ?_ga=2.121106816.927285628.1693783686-923425052.1689224001

レコード番号以外でしたら、下記の形にリクエストボディを変える必要がありそうです。

kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', {
app: APP_ID,
updatekey: { 
    'field': 'Bレコードのキーにしたいフィールド',
    'value':'キーにする値'
},
record: { 最新活動日: {value:new_update } },
});

参考リンク:1 件のレコードを更新する - cybozu developer network

あと何点か気になりますが、
レコード更新日付が更新されているアプリはどのアプリなのでしょうか…?
APPNO「57」はどのアプリの番号ですか?

1 Like

@y_minamitani9534
言葉足らずばかりですいません。
ご指摘の通り、P-NoはBアプリのレコード番号になります。
デバッグでは、Bアプリの最新活動日にAアプリで取得したデータが反映されているところまで確認出来ています。
APPNO:57はBアプリのAPPNOになります。レコード更新日付が更新されているのも、Bアプリのレコードです。

Bアプリの最新活動日にAアプリで取得したデータが反映されているのであれば、先ほどの

③②で取得したBアプリのレコードにある【最新活動日】を①で取得している内容で更新
になります。

は解決しているわけではないのでしょうか?

ちなみ、二つほど前の返信で貼らせて頂いたコードですが、ところどころクォーテーションが全角になってしまっていたので、そちらを半角にしないとエラーかかるので一度クォーテーションの部分は修正されたほうがいいかもしれません。

1 Like

@y_minamitani9534
早々にありがとうございます。
すいません、また私の言葉が悪かったですかね。コンソールログで取得出来ているかを確認しているのですが、その際にBアプリのレコードに入っている状態です。
なのですが、なぜかアプリ上のレコードに反映されていないのです。
(添付のような状態です・・・)
Bアプリレコード

私の確認方法に問題がありそうな気がしてますので、今ご提供頂いたデバッグ方法の部分を見ています。

ちなみ、二つほど前の返信で貼らせて頂いたコードですが、ところどころクォーテーションが全角になってしまっていたので、そちらを半角にしないとエラーかかるので一度クォーテーションの部分は修正されたほうがいいかもしれません。

わざわざありがとうございます。修正してアップしていますが、現状変わりはありませんでした。

なぜか最新活動日が正しい配列に入っていないまま、更新されているようですね…

リクエストボディの形ですが基本的に

app: APP_ID,
id:PNo,
record: { 
    最新活動日: {
        value:new_update 
    } },
})

こういう形(value:)にならないといけないと思うのですが、恐らく

app: APP_ID,
id:PNo,
record: { 
    最新活動日: {
        new_update 
    } },
})

で更新されてしまっているのでそういう形になってしまっているかと思われます。

1 Like

@y_minamitani9534
ご指摘、ありがとうございます。
ちょっと前のコードで
record: { 最新活動日: {value:new_update } },
としていたのですが、色々と試行錯誤している内にvalue:を消してしまっていました。
ご指摘後、修正して再実行したのですが結果は変わらずでした・・・

一応私としても試してみたのですが、value:がない状態だとエラーがでて動作しないと思うのですが、どのような手順でされましたか?

2 Likes

もう一度ソースコードの全体をできれば貼っていただけると何か見えるかもしれません…

1 Like

@y_minamitani9534
何度も何度も、ありがとうございます。
改めてソースを張らせて頂きます。お手数ですが、ご確認頂けますでしょうか。
ちなみに、自分の確認用に変なところでconsole.logが入っていますが、そちらは気になさらないでください
(() => {

'use strict';

kintone.events.on(['app.record.edit.show'], event => {
 const record = event.record;
	const space = kintone.app.record.getSpaceElement('target-space');
	const button = document.createElement('button');
	button.textContent = 'Prospectに反映';
	space.appendChild(button);

	button.addEventListener('click', () => {
        let PNo = '';
        let InterviewDate = '';
		const current = kintone.app.record.get();
        if (current) {
            PNo = current.record.P_No.value;
            InterviewDate = current.record.面談日.value;
          }
          const url = kintone.api.url('/k/v1/record.json', true);
          const APP_ID = 57;
          let new_update = ''
          const body = {
            app:APP_ID,
            id:PNo,
          };
          kintone.api(
            url,
            'GET',
            body,
            (resp) => {
                // 成功時のコールバック関数
                console.log(resp);
                if (resp) {
                    new_update = InterviewDate;
                } 
                resp.record.最新活動日 = new_update
                console.log(resp);
                return event;
               }
          )
          kintone.api(kintone.api.url('/k/v1/record', true), "PUT", {
            app: APP_ID,
            id:PNo,
            record: { 最新活動日: {value:new_update } },
          });
        
          return event;

	});

	return event;

});

})()

あぁなるほど…上記画像の配列の件ですが、BレコードからGETしてきたrespの配列に対して、

resp.record.最新活動日 = new_update
console.log(resp);

のようにnew_updateを最新活動日の部分に代入したあとにそれをconsole.log()しているのでそのように見えているかと思われます。
正しくは、

resp.record.最新活動日.value = new_update
console.log(resp);

になるはずですが、ただそのようにされても、Bレコードを更新できるわけではないです…

上記のコードですと、PUTメソッドではあくまでBレコードのP_Noのレコードに対しては、最新活動日フィールドしか更新されないはずです…

2 Likes

@y_minamitani9534
ご指摘ありがとうございます。
自分の為に入れていたものが余計な邪魔をしてしまっていたようで、失礼致しました。
今回は添付のように、しっかりと取得出来ているように見えます!

上記のコードですと、PUTメソッドではあくまでBレコードのP_Noのレコードに対しては、最新活動日フィールドしか更新されないはずです…

目的としては、Bアプリの最新活動日フィールドが更新されていれば問題ないのですが、今回のコードでもBアプリへの反映はされていないようでした。
お手数ですが、何か他に修正箇所があればご指摘頂けますと助かります(何度もなん何度も本当にすいません・・・)

あとは、別アプリなので同期処理(promiseといわれるもの)は、あんまり関係なさそうですし…
ちなみに、なにもPUTの後になにもでないのでしょうか??
一応ちゃんとPUTが成功して成功しているかどうか引数で確認できるので以下のコードに変えてみて、console.log()になにがでるか確認してみてください…

kintone.api(kintone.api.url('/k/v1/record', true), "PUT", {
            app: APP_ID,
            id:PNo,
            record: { 最新活動日: {value:new_update } },
        },(resp) =>{
            console.log(resp);
        },(error) => {
            console.log(error);
        }) ;
1 Like

@y_minamitani9534
コードを変更し、ログを出力してみました。
こちらで合っていますでしょうか?

なるほど、ちゃんとrevisionでレスポンスかえって来ているので、更新はされているようですね!
どうやらすでに19回目の更新みたいですね。
Bアプリの対象レコード開いて画面更新かけても値はかわらないのでしょうか?

また、画面更新してもだめでしたら、もう一度フィールドコードの見直しが必要かと思われます。

1 Like

@y_minamitani9534
ご確認とご指摘、ありがとうございます。
ご指摘頂きました通り、フィールドコードを
最新活動日=new_action_date
面談日=interview_date
に変更してやってみたのですが、やはり状況は変わりませんでした・・・
20回目のrevisionレスポンスも返ってきているのですが・・・

もし、何か他に怪しそうなところがありましたら、ご指摘頂けますでしょうか。