サブテーブルを、条件付きで別アプリに1レコードずつ登録したい

背景・実現したいこと

 標題の通り、サブテーブルの個別請求日が空欄の行のみ、別アプリへサブテーブル1行を1レコードずつ登録したいと考えております。

エラー情報 (開発者ツールのコンソール)

  利用したソースコード

 テーブルデータを別アプリのレコードに登録したい。

(function() {
  “use strict”;

    //レコード詳細画面_プロセス管理のアクション実行後イベント
    kintone.events.on(‘app.record.detail.process.proceed’, function(event) {

      //変更後のステータス
      const nextStatus = event.nextStatus.value;
        
        //変更後のステータスが「最終承認待」の場合
        if (nextStatus === “最終承認待”) {
                      
          const postApp = 72; //BアプリのID
          const subTable = ‘工事詳細’; //サブテーブルのフィールドコード
          const headers = [ //コピーするサブテーブル外のフィールドのフィールドコード
                ‘constNumber’,
                ‘projectTitle’,
                ‘受注日’,
                ‘納期’,
                ‘完了日’,
                ‘salesDate’,
                ‘受注者’,
                ‘現場責任者’,
                ‘得意先名’,
                ];
            
          kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘POST’, {
            app: postApp,
            records: event.record[subTable].value.map(function (row) {
              const separateDate = subTable.value[‘個別請求日’].value;
                for (const i = 0; i < subTable.length; i++) {
                  if(separateDate[i] !== ‘’) {                  
                    headers.forEach(function (header) {                
                    row.value[header] = event.record[header];
                    });
                  }
                }
                return row.value;
            })
          });
          }
      });
})();

forEachがいけないのか、個別請求日(日付フィールド)の問題かなど考えてみましたが、行き詰ってしまいました。初心者で理解できていない所もあるかと思いますが、ご教示願います。

エラー内容は、個別請求日が読み取れないという内容と思われました。

フィールドコード「個別請求日」が存在するのであれば(こちらからはわからない)、

const separateDate = subTable.value['個別請求日'].value;

のsubTableの指定が誤りの可能性があります。

mapでテーブルを行に分割しているので、行単位の個別請求日を参照するのが期待する動作のようです。

切り出して、サンプルコードを作ってみました。

(function () {
  'use strict';
  kintone.events.on('app.record.detail.show', function (event) {
  event.record['工事詳細'].value.map((row) => console.log(row.value['個別請求日'].value));
    return event;
  });
})();

今回のエラーとは違いますが

      for (const i = 0; i < subTable.length; i++) {

は、

        for (let i = 0; i < subTable.length; i++) {

にしないとエラーがでました。subTable.lengthも最初の理由で期待した結果にならないとおもいます。

harada様

貴重なお時間いただきありがとうございます。

お陰様で、個別請求日は取得できました。

API以下の文を一部修正してみました。

変更前 : const separateDate = subTable.value[‘個別請求日’].value;

変更後 : const separateDate = row.value[‘個別請求日’].value;

kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
            app: postApp,
            records: event.record[subTable].value.map(function (row) {
             
              const separateDate = row.value['個別請求日'].value;
              console.log(row);
                for (let i = 0; i < subTable.length; i++) {
                  console.log(separateDate);
                  if(separateDate[i] != '') {  
                    headers.forEach(function (header) {                
                    row.value[header] = event.record[header];
                    });
                  }
                }
                return row.value; 
            })
          });
          }
      });
})();

エラーは、Uncaught TypeError: Cannot read properties of null (reading ‘0’) となっています。

rowデータを表示させてみたところ、1行目はheaderがありますが、2行目はテーブルデータのみになっています。

再度ご確認いただけると幸いです。

の青いリンクをクリックするとエラーになっている行がわかることがあります。

               for(leti =0; i < subTable.length; i++) {

いまは、行内の詳細や数量などのデータを見たいようにおもいます。

row.lengthで指定するのはいかがでしょうか?

また、個別請求日がとれるようになりましたので先に個別請求日があるかどうかを判断して当該取引の内容を取得する流れになるとおもいます。

Javascript内にdebuggerと記入して開発ウィンドウを表示させればその時点の値が取得できます。

kintoneカスタマイズの基本的なデバッグの流れを身につけよう – cybozu developer network
https://developer.cybozu.io/hc/ja/articles/360038920252-kintone%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E6%B5%81%E3%82%8C%E3%82%92%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%82%88%E3%81%86

 

 

 

harada様

お世話になっております。

mapで配列処理されているので、for文を抜いてみたところ、データの登録に成功しました!

まだ次の課題もあり、デバッグもまだまだこれから習得していかなければならないなところですが、

初心者の拙い説明をご理解いただき誠にありがとうございました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。