1件読込み1件更新を繰り返したい

あるファイルのフラグを一括で更新したいのですが、

レコードの一括更新のAPI説明には

ひとつずつ配列に記述してputとなっています

https://developer.cybozu.io/hc/ja/articles/201941784#step2 

 

ファイルを1件読み込んで更新という方法をしたくてコードを組みましたが

結果はうまく行ったのですが、JSEdit for kintoneのワーニングエラーで

「Dont’ make functions with in a loop」

と表示されるのでダメな記述なんだろうなと思っています。

結果は全部更新されていますが、動きの順番が??です。

console.log で結果を見るとなぜこんな動きなのか。

 

どう書くのが正しいのでしょうか?

 

また、更新した件数をreturnで戻し、その値で再表示を行いたいのですが

読込みや更新の前にreturn処理が行われ、件数を受け取れません。

 

↓console結果

kintone.events.on(‘app.record.index.show’, function (event) {
  let vButton = document.getElementById(‘button’)

  //一括オフ クリック時
  vButton.onclick = function () {

    console.log(“onclick 1”);
    vPutCnt = ApKanriAllPut(0) ;
    console.log(“onclick 2”);

    if (vPutCnt > 0) {
       location.reload();
    }

    return ;
  }
});

function ApKanriAllPut(vFlg){
  let vPutCnt = 0 ;

  //自分のアプリID
  let vMyId = kintone.app.getId() ;

  //パラメータ
  let requestParam = {
      ‘app’: vMyId ,
      ‘query’: kintone.app.getQuery()
  };

  console.log(“Get Mae”);

  //対象のレコードを読み込む
  kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, requestParam,
  function(resp) {
    for (let i=0 ; i < resp.records.length ; i++) {
       let vRecId = resp.records[i].レコード番号.value ;

       //パラメータ
       let requestParam1 = {
            ‘app’: vMyId ,
            ‘id’: vRecId ,
            ‘record’: {
               ‘フラグ’: {‘value’: vFlg  }
            }
       };

      console.log(“i=” + i + " " +“id=” + vRecId) ;

       //指定レコードIDを更新する
       kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, requestParam1,
         function(resp1) {
            console.log(“i=” + i + " " + “PUT OK” + " Recid=" + vRecId) ;
            vPutCnt = vPutCnt + 1 ;
         } ,
           function(err1) {
             console.log(“PUT NG”) ;
         }
       );
    }
  } ,
  function(err) {
     console.log(“GET NG”) ;
  }
)

console.log(“Return Mae=” + vPutCnt);

return vPutCnt ;
}

ちゃいな嬢 様

 

JSEdit for kintone から「Dont’ make functions with in a loop」 表示されるように現状ですとレコード数が多くなった場合にリクエスト過多によりエラーが発生するかもしれません。

 

対処方法として、async/await 利用すると順番通り処理されるのではないかと思います。

目指せ!JavaScriptカスタマイズ中級者(2) 〜Promiseのかわりにasync/await編〜 – cybozu developer network

 

サンプルとして記述の変更内容を置いておきますので、上記URLの内容からasync/awaitを勉強して頂ければと思います。

基本は、fanction定義の前に async を置き、非同期処理の前に await を置くような感じになると思います。

沢山、ネット上にありますので記述を読んで勉強して頂けれ幸いでございます。

(function () {
  "use strict";
  kintone.events.on("app.record.index.show", function (event) {
    let vButton = document.getElementById("button");

    //一括オフ クリック時
    vButton.onclick = async function () {
      console.log("onclick 1");
      let vPutCnt = await ApKanriAllPut(0);
      console.log("onclick 2");
      if (vPutCnt > 0) {
        location.reload();
      }

      return;
    };
 });

 async function ApKanriAllPut(vFlg) {
    let vPutCnt = 0;

    //自分のアプリID
    let vMyId = kintone.app.getId();

    //パラメータ
    let requestParam = {
      app: vMyId,
      query: kintone.app.getQuery(),
    };

    console.log("Get Mae");

    //対象のレコードを読み込む
    await kintone.api(kintone.api.url("/k/v1/records", true), "GET", requestParam).then(
      async function (resp) {
        for (let i = 0; i < resp.records.length; i++) {
          let vRecId = resp.records[i].レコード番号.value;

          //パラメータ
          let requestParam1 = {
            app: vMyId,
            id: vRecId,
            record: {
              フラグ: { value: vFlg },
          },
        };
        console.log("i=" + i + " " + "id=" + vRecId);

          //指定レコードIDを更新する
          await kintone.api(kintone.api.url("/k/v1/record", true), "PUT", requestParam1).then(
            function (resp1) {
              console.log("i=" + i + " " + "PUT OK" + " Recid=" + vRecId);
              vPutCnt = vPutCnt + 1;
            },
            function (err1) {
              console.log("PUT NG");
            }
          );
        }
      },
      function (err) {
        console.log("GET NG");
      }
    );
    console.log("Return Mae=" + vPutCnt);
    return vPutCnt;
  }
})();

 

また、JSEdit for kintoneのエラー等が気になるようでしたら、一括更新などを利用されるとよいかと思います。

ちゃいな嬢 様と同じ内容の動きをするサンプルを下記に置いておきます。

※function ApKanriAllPut は JSEdit for kintoneでは名前をクラス等と間違って警告がでますので、『apKanriAllPut』へ変更しております。

(function () {
  "use strict";

  function apKanriAllPut(vFlg, event) {
    let records = event.records;
    let putRecords = [];
    for(let i = 0; records.length > i; i++) {
      let rec = records[i].レコード番号.value;
      let put = {
        "id": rec,
        "record": {
          "フラグ": {"value": vFlg}
        }
      };
      putRecords.push(put);
    }
    let requestParam = {
      "app": kintone.app.getId(),
      "records": putRecords
    };
    kintone.api(kintone.api.url("/k/v1/records", true), "PUT", requestParam, function (resp) {
      location.reload();
    }, function (err) {
      console.log("PUT NG", err.message);
    });
  }

  kintone.events.on("app.record.index.show", function (event) {
    let vButton = document.getElementById("button");

    //一括オフ クリック時
    vButton.onclick = function () {
      if(!event.records[0]) {
        return alert("レコードがありません");
      }
      apKanriAllPut(0, event);
      return;
    };
  });
});

新屋さま

ありがとうございます!  少しずつ勉強していて、async/await かなとまでは

たどり着いたけど意味が理解できず困っていました。

非同期だけど待つ?の意味が・・非同期って待たずに実行ですよね?

日本人ですが日本語が??ってなってました。ネットで書いてるのを勉強してても

難しいです。もう動かして理解するしかないですね。

結局その処理が終わるまで次の処理をしたくない時にasync/await を使用するのですよね?

処理A

関数B

処理c

で関数Bの結果をcで使用したい場合とか?

一括更新もありがとうございます!

最初のコードは記述して想定通りに行くことを確認しました。

一括更新も試してみます!

ほんと丁寧な回答に感謝します。

ちゃいな嬢 様

 

概ね私の理解も似たようなものです。

およそ1ヵ月前に、あれ順番通りに処理されない・・・から始まり、Promise ってなんだろうという感じで必死に本やネットの記述を読まくりました。

結局、自分で記述して動きを見て検証して納得するってことを繰り返しています。

【動かして理解する】ってことに本当にその通りだなと感じているところです。

async/await も今回のちゃいな嬢 様の内容をみて初めて試してなんとなく理解した程度です。

 

私の拙い回答で納得していただけたようで良かったです。

新屋さま

javascriptを初めて触ったのが8月下旬・・そしてkintone用を触り始めたのが9月中旬過ぎ

右も左もわからない状態で奮闘し、ここの質問を活用させてもらい理解を深めています。

そして修正したらIEでは動かないことを理解しました。

EdgeとIEで裏表みたいに使用していたので。

奥深い事多いですが勉強になりました!