アプリの一括更新ボタンで全件スペースフィールドの値を数値フィールドへ入れたい

どうぞよろしくお願いいたします。

(以前以下でもご質問させていただいておりました。)

https://developer.cybozu.io/hc/ja/community/posts/4408516877081-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7%E3%81%8B%E3%82%89%E5%90%88%E8%A8%88%E9%87%91%E9%A1%8D%E3%82%92%E7%AE%97%E5%87%BA%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E7%B7%A8%E9%9B%86%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%95%E3%81%AA%E3%81%84%E3%81%A8%E5%80%A4%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93 

現在このような状態です。

【行いたいこと】
・「一括更新ボタン」を押下すれば、全件分スペースフィールドの値を数値フィールドに反映させたいです。

【状態】
・グループマスタというアプリのスペースフィールドと数値フィールドに、
項目Aの合計金額をそれぞれ表示させています(同じ合計金額です)

・スペースフィールドはアプリを開くたびに都度合計金額が算出されるjsを組みました。(成功)

・数値フィールドにも合計金額が表示されるjsを組みました。(一応成功)

・しかし数値フィールドは1000件余りあるデータの1件1件に対し

編集ボタンクリック⇒(値がフィールドに反映される)⇒保存ボタンクリック

上記の処理をしないと値が反映されません。

・一括更新ボタンは詳細画面ではなくアプリのトップ画面に配置しています。

【ご質問内容】

・GETする際クエリの作成も必要でしたでしょうか

・スペースフィールドの値の取得⇒数値フィールドへの反映方法が分かりません。できるのでしょうか。
他試したもの
var spaceVal = kintone.app.record.getSpaceElement(“要素ID”).textContent;

結果は undefined でした。

※私の作業環境が、セキュリティの関係で見ることができないページや(teratail他)
このデベロッパー内でもヒントとなるようなコードが表示されないなど制限があり十分に調査ができません。
そのためもしかしたら簡単に解決できるような内容かもしれませんが、お許しください。

またTISに希望する処理を行うプラグインがあるようなのですが仮想環境のみ使用できる状態で使用したい環境では使うことができません。

 

色々と理解していない部分があり申し訳ないのですが

ご教示いただけると幸いです。どうぞよろしくお願い致します。

(function () {
  "use strict";
  kintone.events.on('app.record.index.show', function (event) {
  if (document.getElementById ('my_index_button') !== null) {
  return;
  }
  var myIndexButton = document.createElement('button');
  myIndexButton.id = 'my_index_button';
  myIndexButton.innerHTML = '一括更新';

  // ボタンクリック時の処理
  myIndexButton.onclick = function() {
    // アプリIDを取得(必須の引数)
    var appId = kintone.app.getId();
    kintone.api('/k/v1/records', 'GET', {app: appId}, function(resp) {
      /////// 更新オブジェクトの生成
      var param = {
        "app": appId,
        "records": []
       };

      // resp['records'].length ⇒ 100件
      for (var i = 0; i < resp['records'].length; i++) {
        var record = {};
        //ここでスペースフィールドの値を取得してTESTフィールドに値を入れる?⇒undefinedで入らず
        var spaceVal = kintone.app.record.getSpaceElement["要素ID"];
        record['TEST']['value'] = spaceVal;

        param['records'][i] = {
          "id": resp['records'][i]['レコード番号'].value,
          record
        }
      }
      kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', param, function(resp) {
        // success
        console.log(resp);
      }, function(error) {
        // error
        console.log(param);
        console.log(error);
      });
    });
  }
  kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();

こんにちは。

アプリの詳細画面に「スペースフィールド」があって、そこに集計結果を表示している

んですね:eyes:

その集計結果を表示しているスペースフィールドの値は、

詳細画面を開いて、ブラウザ上に表示しているとき以外は生きていない(動いていない) ので
一覧側から見ても値は入ってない状態だと思います。

 

基本的には

> しかし数値フィールドは1000件余りあるデータの1件1件に対し
> 編集ボタンクリック⇒(値がフィールドに反映される)⇒保存ボタンクリック
> 上記の処理をしないと値が反映されません。

これをしていないと値は反映されないと思います。

 

とすると、一覧から集計してフィールドを更新するようなボタンを作るといいかも知れないですね:eyes:
というのは、

一覧でボタンを押すと、
詳細画面でやっていることを全1000件分やって、
それぞれのレコードのフィールドを更新して上書き保存する

のような・・・。

juridon 様

コメントありがとうございます。

いろいろ勉強不足で申し訳ないです。

>一覧でボタンを押すと、
>詳細画面でやっていることを全1000件分やって、
>それぞれのレコードのフィールドを更新して上書き保存する

こちらは、貼り付けたコード内の下記の部分にその処理を書く認識で合っていますか?

      // resp['records'].length ⇒ 100件
      for(vari =0; i < resp['records'].length; i++) {
        varrecord = {};
        //ここでスペースフィールドの値を取得してTESTフィールドに値を入れる?⇒undefinedで入らず
        varspaceVal = kintone.app.record.getSpaceElement["要素ID"];
        record['TEST']['value'] = spaceVal;
        param['records'][i] = {
          "id": resp['records'][i]['レコード番号'].value,
          record
        }
      }

 

また、

https://jp.cybozu.help/k/ja/admin/limitation/limit.html?_gl=1*qt0v35*_ga*MTg3NjY5ODc3Ny4xNjM2OTQ4Mzcy*_ga_T5K95WXL54*MTYzNjk0ODM3Mi4xLjEuMTYzNjk0OTY0Mi4w&_ga=2.197909935.1059432527.1636948372-1876698777.1636948372 

上記の「制限値一覧」で「アプリのレコード操作API」では「一度に登録、更新、および削除できるレコード:100件まで」と記載があり、

実際上記コードの「resp[‘records’].length」は100しかなかったのですが上記の方法だと100件分しか更新できないということなのでしょうか。。?

 

ご質問ばかりで申し訳ありませんが、ご教示頂けますでしょうか。

UMEさん

>貼り付けたコード内の下記の部分にその処理を書く認識で合っていますか?
そのコードでは集計してないですね:eyes:

各詳細画面開いたときに集計していると思うのですが、
その集計を一覧でも各レコードごとにやって、レコードを更新するリクエストパラメータを1000件分作らないといけないです。
けっこう大変かと・・・:sweat_drops::sweat_drops:

>上記の「制限値一覧」で「アプリのレコード操作API」では「一度に登録、更新、および削除できるレコード:100件まで」と記載があり、

はい、一回APIを叩くだけでは1000件無理ですので、、1000件なら10回くらい繰り返さないといけないですね:sweat_drops:
汎用的に作るのはけっこう大変かと:sweat_drops::sweat_drops:
100件ずつ順番に更新していく感じになるかと思います。

それをカスタマイズで実現しようとすると(単純に考えると、)

ボタンをクリック
(1回目の繰り返し)
100件分レコード取得
100件分の更新用リクエストパラメータを作る
100件更新する
(2回目の繰り返し)
次の100件分レコード取得
100件分の更新用リクエストパラメータを作る
100件更新する
(3回目の繰り返し)
・・・
みたいな感じになるかと思いますが、どこかで処理をミスったときには元の状態には戻せない(ロールバックできない)ので

1000件分先に取得&更新用のリクエストパラメータを作っておいて、
bulkrequestで更新したほうがいいかも知れないです:sweat_drops::sweat_drops:
一括更新、お手製で作るのけっこう大変かと思います:sweat_drops::sweat_drops:

 

そこで、カスタマイズは最小限にして、

(1)Excelなどで一旦レコード全体を書き出し&集計値を入力するフィールド追加する
(2)Excel上に集計値の列を追加して、計算式などを使って集計値を別途計算して全行埋める
(3)(2)のExcelを読み込んで全レコードを更新する

の作業で今あるレコードの集計値を全部更新したあとで、
詳細画面を表示したら「スペースフィールド」の表示の更新ではなくて、実際のフィールドを更新(上書き保存)するようにカスタマイズするようにしてみるのはいかがでしょうか?

juridon

遅くなり申し訳ありません。

ご返信ありがとうございます。

あまり実用的でないことは理解いたしました。。^^;

javascriptを使用しない形でフィールドには集計結果を表示させたいと思います。

この度はご教示頂いてありがとうございました。

ただただ時間だけが過ぎていくばかりでしたので、助かりました!

 

 

 

UMEさん

おはようございます!
いえいえ、機能自体は実用的ではあると思うのですが、
自作となるとなかなかの高難易度カスタマイズかなと思います:sweat_drops::sweat_drops:

複雑ですので、想定外の動作をしたり、思いも寄らなかったバグがでてきたり、するかも知れません。
また、一括更新するにも、毎回全件を更新するのか?とか、
更新済みのレコードは更新しないとするなら更新済みのレコードはどうやって判断するのか?とか、
一括更新を押して良いアカウントは誰か?など
追加で考えないといけない仕様もでてくるかと思います。

というわけで、もし自作するならですが、
少しずつ作ったほうが良いかなと思います。

まずは詳細画面で「表示だけ」じゃなくて、
編集画面で保存を押さなくても「レコードに保存」できるところを作り、
それがうまく動いたら、追加で仕様を入れ込みながら

一覧画面から1件更新できるようにしてみる

100件以内なら更新できるようにしてみる

全件更新できるようにしてみる

みたいな感じに育てていくといいのかなぁと思います。(結構時間かかると思います^^;)

しかし、、、詳細画面を表示しないと見えないというのは不便ですよね(><)

juridon

実用的ではない→現実的ではない(私にとって^^;)というところでしょうか。。

上司からのご依頼だったのであまり時間をかけることもできず。。

何度も申し訳ないのですが、

私の理解力ではご説明頂いたすべてをすぐには把握できないのですが

結局のところ

・項目A(「関連レコード一覧フィールド」)の合計値をjavascriptにより「数値フィールド」へ反映されたのはいいが1件1件編集、保存を行わないと画面に反映されない

・しかしそれは仕様なので仕方なく、実現したいのであれば他の手を探さないといけない

今回は以前アドバイス頂いたこともあり以下に目を付けました。

APIを使って関連会社のレコードを取得し、全件に適用する。

・しかしそれも上限100件という制限があるし、初心者では難易度が高い

上記の理解でいいのでしょうか。

ただ数値フィールドに値を反映させたいだけなのに。。。(T T)

正直「APIを使って関連会社のレコードを取得し、全件に適用する」というアドバイスもまだ頭で想像ができず「そうなのか…」という段階でしかないのですが^^;

 

 

 

UMEさん

>・項目A(「関連レコード一覧フィールド」)の合計値をjavascriptにより「数値フィールド」へ反映されたのはいいが1件1件編集、保存を行わないと画面に反映されない

こちらは仕様というわけではないのですが、
詳細画面を開いただけで「更新(上書き保存)」するとか、一括更新するという場合にはkintone REST APIをいい感じに使わないといけないです(><)

>・しかしそれも上限100件という制限があるし、初心者では難易度が高い
そうですね、
上限100件は、次の100件、次の100件と、1000件分(更新したい件数分)を繰り返すことはできるのですが、
難易度高めかなと思います:sweat_drops::sweat_drops:

>ただ数値フィールドに値を反映させたいだけなのに。。。(T T)
そうですよね、意外と色んな要素が絡み合って結構複雑になっちゃいます~(ToT)

初心者だけど、カスタマイズを安全にやりたい・・・という場合は
カスタマイン(私は詳しくないのですが:sweat_drops::sweat_drops:)の導入や、サイボウズさんのパートナー企業さんにお願いするのも手です。
(お金はかかっちゃいますが安全や仕様追加などやりやすいと思います)

自作したいという場合はこのあたりを検索してサンプルコードを組み立てられれば・・・できるかも?と思います:eyes:
kintone 一覧 更新
kintone 詳細画面 更新
kintone 100件 再帰的
kintone promise

※自作されるという場合は、コードを組み立ててみられて、この行のこの部分がわからない・・・
という感じで投稿してくださるとなにかアドバイスできるかも知れません(><)

また、標準機能やプラグイン等で実現したいという場合はキンコミというサイトでアイデア募集してもいいかも知れません:eyes:

うまくいくといいのですが~(><)

juridon 様

稚拙なご質問にも関わらず何度もご丁寧にありがとうございます。。。!(T T)

参照先まで教えて頂けるなんて。。お手数お掛けしてすみません。。

アドバイス頂いた内容を拝見して裏で少しずつ進めつつ、

一旦今回の件はExcelで算出して対象のフィールドにアップしていこうと思います。

この度は本当にありがとうございました。。。!(T T)