ドロップダウンの値から別アプリの値を取得したい

ドロップダウン「不具合品等の種別」フィールドの値を変更した時、同じ値を持つ別アプリからレコードを取得してテーブルに書き出す処理を行いたいです

ドロップダウンの値を変更した時以下のエラーが発生しました。
原因が分からず教えていただければ幸いです

app.record.create.change.不具合品等の種別 is not allowed to return “Thenable” object.

GET

下記実行したJavaScriptになります
(function($) {
“use strict”;
// ドロップダウンフィールド[不具合品等の種別]の値が変更されたときのイベントリスナーを設定
kintone.events.on([“app.record.create.change.不具合品等の種別”, “app.record.edit.change.不具合品等の種別”], function(event) {
var record = event.record;
var selectedValue = record[“不具合品等の種別”].value;
// 別アプリのIDを設定
var otherAppId = 243; // ここに別アプリのIDを設定
// クエリを設定して別アプリからデータを取得
var query = ‘ブランド = "’ + selectedValue + ‘"’;
var params = {
app: otherAppId,
query: query,
fields: [“製品番号”, “製品名”] // 必要なフィールドを指定
};
// 非同期処理でデータを取得
return kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params).then(function(resp) {
var records = resp.records;
// テーブルを初期化
var table = record[“製品管理テーブル”].value;
table.length = 0;
// 取得したレコードをテーブルに追加
records.forEach(function(resRec) {
table.push({
value: {
“製品番号”: {
value: resRec[“製品番号_1”].value
},
“製品名”: {
value: resRec[“製品名_テーブル”].value
}
}
});
});
// レコードを更新
return kintone.app.record.set({ record: record });
}).catch(function(error) {
console.error(“API Error:”, error);
// エラーハンドリングを追加
return event;
});
});
})(jQuery);

// 非同期処理でデータを取得
return kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params).then(function(resp) {

ここに問題があります。changeイベントはPromiseに対応していないのでPromiseを使用することはできません。Promiseを使用せずにREST APIを実行し、成功時にkintone.app.record.get()とkintone.app.record.set()でレコードの内容を書き換える必要があります。
こちらのスレッドが参考になるかと思います。

橋本大輔様
ご回答いただきありがとうございます
スレッドを参考に修正してみたのですが下記のソースコードで合っておりますでしょうか

(function($) {
“use strict”;
// ドロップダウンフィールド[不具合品等の種別]の値が変更されたときのイベントリスナーを設定
kintone.events.on([“app.record.create.change.不具合品等の種別”, “app.record.edit.change.不具合品等の種別”], function(event) {
var record = event.record;
var selectedValue = record[“不具合品等の種別”].value;
// 別アプリのIDを設定
var otherAppId = 243; // ここに別アプリのIDを設定
// クエリを設定して別アプリからデータを取得
var query = ‘ブランド in "’ + selectedValue + ‘"’;
var params = {
app: otherAppId,
query: query,
fields: [“製品番号”, “製品名”] // 必要なフィールドを指定
};
// 非同期処理でデータを取得
return kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params).then(function(resp) {
//var records = resp.records;

  //↓修正箇所
  ver records = kintone.app.record.get();

  // テーブルを初期化
  var table = record["製品管理テーブル"].value;
  table.length = 0;
  // 取得したレコードをテーブルに追加
  records.forEach(function(resRec) {
    table.push({
      value: {
        "製品番号": {
          value: resRec["製品番号_1"].value
        },
        "製品名": {
          value: resRec["製品名_テーブル"].value
        }
      }
    });
  });
  // レコードを更新
  return kintone.app.record.set({ record: record });
}).catch(function(error) {
  console.error("API Error:", error);
  // エラーハンドリングを追加
});
return event;

});
})(jQuery);

五月雨式で申し訳ございません
JavaScriptの修正を改めて行いましたところ
下記のエラーが発生致しました
·Cannot read properties of undefined (reading ‘catch’)

·GET

修正JavaScript

(function($) {
“use strict”;
// ドロップダウンフィールド[不具合品等の種別]の値が変更されたときのイベントリスナーを設定
kintone.events.on([“app.record.create.change.不具合品等の種別”, “app.record.edit.change.不具合品等の種別”], function(event) {
var record = event.record;
var selectedValue = record[“不具合品等の種別”].value;
// 別アプリのIDを設定
var otherAppId = 243; // ここに別アプリのIDを設定
// クエリを設定して別アプリからデータを取得
var query = ‘ブランド in "’ + selectedValue + ‘"’;
var params = {
app: otherAppId,
query: query,
fields: [“製品番号”, “製品名”] // 必要なフィールドを指定
};
// 非同期処理でデータを取得
kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params,function(resp) {
var records = resp.records;
var rec = kintone.app.record.get();

  // テーブルを初期化
  var table = rec.record["製品管理テーブル"].value;
  table.length = 0;
  // 取得したレコードをテーブルに追加
  records.forEach(function(resRec) {
    table.push({
      value: {
        "製品番号": {
          value: resRec["製品番号_1"].value
        },
        "製品名": {
          value: resRec["製品名_テーブル"].value
        }
      }
    });
  });
  // レコードを更新
  kintone.app.record.set({ record: rec.record });
}).catch(function(error) {
  console.error("API Error:", error);
  // エラーハンドリングを追加
});
return event;

});
})(jQuery);

kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params,function(resp) {
中略
}).catch(function(error) {

thenで繋ぐならcatch()で繋いでいく形で問題ありませんが、繋がずに成功時コールバック関数で処理を書いているので、それなら

kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params,function(resp) {
中略
}, function(error) {

と失敗時コールバック関数を書く必要があります。以前はその辺り詳しい解説ページがあったんですが今はなくなっていますね。こちらのコールバック云々と書いてある場所が参考になるのではないかと思います。

ありがとうございます
·Cannot read properties of undefined (reading ‘catch’)
こちらのエラーは無事解消致しました。

GET
上記エラーについてはなにか原因等分かりますでしょうか
URLになっていたので確認したところ「“message”:"認証に失敗しました。セッション認証には、「X-Requested-With」ヘッダーが必要です。」
と表示されました。

そのエラーは通常kintone外からAPIを叩いたりした場合に出るエラーのはずで、リクエストボディに問題があった場合も出るはずです。デベロッパーツールから辿っていけば原因が掴めるかと思います。
気になったところとしては、

// クエリを設定して別アプリからデータを取得
var query = ‘ブランド in "’ + selectedValue + ‘"’;

// クエリを設定して別アプリからデータを取得
var query = ‘ブランド in ("’ + selectedValue + ‘")’;

クエリに演算子inを使う場合、値が一つでもかっこで囲む必要があります。詳しくはクエリの書き方の「フィールド、システム識別子ごとの利用可能な演算子と関数一覧」をご覧ください。

ご回答いただきありがとうございます
何度も申し訳ございません。
橋本様のご指摘通り修正したところ別のエラーが発生致しました
Cannot read properties of undefined (reading ‘value’)

該当箇所
value: resRec[“製品番号_1”].value

原因分かりますでしょうか

そのエラーはresRec[“製品番号_1”].valueのvalueに辿り着けない旨のエラーで、つまりresRec[“製品番号_1”]がそれ以上参照できない状態であるにも関わらずそのvalueにアクセスしようとしているためです。簡単に言えばフィールドコードが間違っています。

そもそも、クエリの

fields: [“製品番号”, “製品名”] // 必要なフィールドを指定

ここで「製品名」「製品番号」フィールドしか取得していない設定をしているにも関わらず製品番号_1というフィールドにアクセスすることはできません。

申し訳ございません
こちら私がフィールドコードを間違えており発生しておりました

下記のように修正したところ画像の
kintone側のエラーのようなものが発生致しました

// 取得したレコードをテーブルに追加
records.forEach(function(resRec) {
table.push({
value: {
“製品番号_1”: {
value: resRec[“製品番号”].value
},
“製品名_テーブル”: {
value: resRec[“製品名”].value
}
}
});

サブテーブルに行を追加していく場合、フィールドの値(value)だけでなく、フィールドの形式(type)も必要になります。また連想配列に2つ以上のkeyを設定する場合、カンマが必要になります。

    table.push({
      value: {
        "製品番号": {
          value: resRec["製品番号_1"].value
        },
        "製品名": {
          value: resRec["製品名_テーブル"].value
        }
      }

    table.push({
      value: {
        "製品番号": {
          type: 'SINGLE_LINE_TEXT',
          value: resRec["製品番号_1"].value
        },
        "製品名": {
          type: 'SINGLE_LINE_TEXT',
          value: resRec["製品名_テーブル"].value
        }
      }

フィールド形式はフィールドによって異なります。フィールド形式のページを参考にして下さい。

橋本様
無事実装することができました
丁寧に教えていただきありがとうございました。

「いいね!」 1

橋本様
お世話になっております

下記コードにルックアップフィールドの再取得を追加したのですが動きません
コンソールにもエラー等が出ておらず…
原因分かりますでしょうか

(function($) {
“use strict”;

// ドロップダウンフィールド[不具合品等の種別]の値が変更されたときのイベントリスナーを設定
kintone.events.on([“app.record.create.change.不具合品等の種別”, “app.record.edit.change.不具合品等の種別”], function(event) {
var record = event.record;
var selectedValue = record[“不具合品等の種別”].value;

// 別アプリのIDを設定
var otherAppId = 243; // ここに別アプリのIDを設定

// テーブルフィールド名を指定
var tableField = “製品管理テーブル”;

// 「不具合品等の種別」が空または「ストライカー製」の場合、テーブルをクリア
if (!selectedValue || selectedValue === “ストライカー製”) {
if (record[tableField]) {
record[tableField].value = ;
kintone.app.record.set({ record: record });
}
return event;
}

// クエリを設定して別アプリからデータを取得
var query = ‘ブランド in ("’ + selectedValue + ‘")’;
var params = {
app: otherAppId,
query: query,
fields: [“製品番号”, “製品名”] // 必要なフィールドを指定
};

// 非同期処理でデータを取得
kintone.api(kintone.api.url(“/k/v1/records”, true), “GET”, params, function(resp) {
var records = resp.records;
var rec = kintone.app.record.get();

 // テーブルを初期化
 var table = rec.record[tableField].value;
 table.length = 0;

 // 取得したレコードをテーブルに追加
 records.forEach(function(resRec, index) {
   table.push({
     value: {
       "製品番号_1": {
         type: 'SINGLE_LINE_TEXT',
         value: resRec["製品番号"].value
       },
       "製品名_テーブル": {
         type: 'SINGLE_LINE_TEXT',
         value: resRec["製品名"].value
       },
       "ロット番号_0": {
         type: 'SINGLE_LINE_TEXT',
         value: ""
       },
       "数値": {
         type: 'SINGLE_LINE_TEXT',
         value: ""
       },
       "不具合品の受領_0": {
         type: 'SINGLE_LINE_TEXT',
         value: ""
       }
     }
   });
 });

 // レコードを更新してルックアップフィールドを再取得
 kintone.app.record.set({ record: rec.record }, function() {
   table.forEach(function(row, index) {
     kintone.app.record.lookup({
       rowIndex: index,
       fieldCode: "製品名_テーブル"
     });
   });
 });

}, function(error) {
console.error(“API Error:”, error);
// エラーハンドリングを追加
});

return event;
});
})(jQuery);

フィールドのルックアッププロパティをtrueにするか、文字列UPDATEを挿入すれば可能だと思います。ただし、lookup = trueはルックアップのフィールドに入力された文字で検索した結果が1件のみだった場合に自動取得される動作なので、検索結果が複数ある場合は動作しません(「取得」を押したと時の挙動とは異なります)。こちらに載っています。

   table.push({
     value: {
       "製品番号_1": {
         type: 'SINGLE_LINE_TEXT',
         value: resRec["製品番号"].value
       },
       "製品名_テーブル": {
         type: 'SINGLE_LINE_TEXT',
         value: resRec["製品名"].value,
         lookup: true
       },

あと、以下のコメントアウトした部分はいらないです。

 // レコードを更新してルックアップフィールドを再取得
 kintone.app.record.set({ record: rec.record }/*, function() {
   table.forEach(function(row, index) {
     kintone.app.record.lookup({
       rowIndex: index,
       fieldCode: "製品名_テーブル"
     });
   });
 }*/);

今回の処理は今回の処理として、チュートリアルをから学んでいくのをおすすめします。

橋本様
ご回答いただきありがとうございます
まだJavaScriptを初めて日が浅いのでチュートリアルの方を勉強していこうと思います。