複数選択フィールドのデータを別アプリの文字列(1行)フィールドにコピーする方法

背景・実現したいこと

昨日ご質問させていただいた内容の続きになります。

今度は複数選択フィールドで選択した項目をもとに、別の文字列フィールドからデータを取得。
取得したデータを最終的には文字列(1行)で出力したいと考えております。

・[顧客管理]アプリ:参照先
チーム名:複数選択フィールド
担当課:文字列フィールド(※最終的に反映させたい項目)

・[ユーザーマスタ]アプリ :参照元
チーム名:文字列フィールド
担当課:文字列フィールド

<取得したいイメージ>
①[顧客管理]アプリの複数選択フィールド「チーム名複数」で、"A"と"B"を選択。
②[ユーザーマスタ]アプリにて、①で選択したチーム名に該当する「担当課」を検索。
A→1課、B→2課
③[顧客管理]アプリの文字列フィールド「担当課」に出力するときには、"1課,2課"と出力する。

上記のようにしたいのですが、そもそも値を取得する前段階でエラーで止まってしまい、どこをどのように修正したらいいのか全く判断がついていないのが現状です。

 

エラー情報 (開発者ツールのコンソール)
Uncaught ReferenceError: param is not defined
というエラーメッセージが出ていますので、そもそもGETで渡してあげるparamが間違っているようです。

 

 

利用したソースコード

**(function() {  
    'use strict';  
          
  kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event) {  
        var record = event.record;  
        var teams = record['チーム名複数'].value;  
        var str = "";  
          
        // 複数選択フィールド「チーム名複数」で選択した項目が複数だったら  
        // カンマで区切って文字列にする   
        for (let o of teams){  
          if(str===""){  
            str=o;  
          }else{  
            str=str + "," + o;  
          }  
        }  
          
        var param = {  
            'app': 189,  
            'query': query  
        };  
        return kintone.api(kintone.api(  
          kintone.api.url('/k/v1/records', true),   
          'GET',  
          param  
        )  
        .then(function(resp) {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(let i = 0; i \< records.length; i++){  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var apprecs = resp.records[i];  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // もし複数チーム名を選択したら、カンマで区切って文字列1行で表現する  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(record['担当課'].value){  
&nbsp;    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;record['担当課'].value = record['担当課'].value + "," + apprecs['担当課'].valueue;  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }else{  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; record['担当課'].value = apprecs['担当課'].value;  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return event;  
&nbsp; &nbsp; &nbsp; &nbsp; }));  
&nbsp; });  
})();**  

 ※下の方の処理までデバッグできていないため、あくまでできる想定で書いたコードになります。

修正点だらけかとは思いますが、
意図した通りに実現させるためにはどのように修正いいのか、ご教示いただけますと幸いです。

「xxxxx is not defined」というエラーはxxxxxが見付からない(var xxxxx…等の宣言をしていない)場合に出る構文エラー(プログラムを実行する前に、プログラムの文に問題があった場合に出るエラー)です。

見た限りparamは宣言されているようですが、その中のqueryが宣言されていません(恐らくstrをqueryにしたかったのではないかと思います)。

また、複数条件ある場合のクエリの書き方は

'チーム名 = "A" or チーム名 = "B"'

と、orやandで条件を繋ぐ必要があります(このあたり で詳しく解説されています)。

今回の場合、リクエストボディは

    var param = {
        'app': 189,
          'query': record['チーム名複数'].value.map((value) => `チーム名 = "${value}"`).join(' or ')
    };

以上のような形で可能です(ただし、チーム名複数が何も選択されていないと逆に全てのレコードを取得するので、何も選択されていない場合は途中でreturn event等で以降の処理をさせないようにする必要があります)。

 

また、

    return kintone.api(kintone.api(
      kintone.api.url('/k/v1/records',true),
      'GET',
      param
      )

kintone.apiが1つ多いようです。

385013133091 様
早速アドバイス・ご指摘いただきありがとうございました!
クエリの書き方もまだ理解しきれていないため、とても勉強になりました。

ご教示いただいた箇所の変更と、スペルミスや想定通りに動くように処理を修正して、最終的に下記のような形になりました。

(function() {
    'use strict';
        
    kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event) {
        var record = event.record;
        // 担当課フィールドに値が入っている場合があるので処理前に初期化する
        record['担当課'].value = "";

        var param = {
            'app': 189,
            'query': record['チーム名複数'].value.map((value) => `チーム名 = "${value}"`).join(' or ')
        };
   
        return kintone.api(
          kintone.api.url('/k/v1/records', true), 
          'GET',
          param
        )
        .then(function(resp) {
            for(let i = 0; i < record['チーム名複数'].value.length-1; i++){
              var apprecs = resp.records[i];
              // もし複数チーム名を選択したら、カンマで区切って文字列1行で表現する
              if(record['担当課'].value && apprecs['担当課'].value){
                // 同じ課の場合は文字列の結合を省略する
                var reg = new RegExp(apprecs['担当課'].value);
                if(!record['担当課'].value.match(reg)){
                  record['担当課'].value = record['担当課'].value + "," + apprecs['担当課'].value;
                }
              }else{
                record['担当課'].value = apprecs['担当課'].value;
              }
            }
            return event;
        });
 });
})();

FUJI さま

1つ気になったのですが、

            for(let i = 0; i < record['チーム名複数'].value.length-1; i++){

この部分のループは「チーム名複数フィールドの選択している個数から1を引いた数までループ」という意味になっていますが、間違いないでしょうか?
(チーム名複数を「A,B」で選択していた場合は1回のみ実行、チーム名複数を「A」のみ選択していた場合は0回実行となり実行しない)

今回のような処理だと、チーム名複数の値を元にループをするのではなく、取得したレコードの数を元にループをするのが良いかと思います。

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

こちらで取得したレコード分のforループを実行できます。

 

最終的には

    .then(function(resp) {
      record['担当課'].value = resp.records.map((masterRecord) => masterRecord['担当課'].value).join(','); // 区切り文字を変えたい場合はjoinの中の文字を変更

        return event;
    });

こちらで必要な処理ができると思いますが、慣れない内はループ処理から覚えていくのが良いと思います。

 

また、私も途中で気付いて追記した部分ですが、チーム名複数フィールドを何も選択していない状態で保存するとクエリ(絞り込み条件)が空白になり全てのレコードを取得してしまうので、

kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event) {
    var record = event.record;

  if (!record['チーム名複数'].value.length) {
record['担当課'].value = '';

     return event; // チーム名複数の選択数が0の場合処理を終了
}

のように以降の処理をさせないようreturn eventをする必要がありそうです。