新規投稿
フォローする

レコード一覧画面に、すべてのレコードを更新するボタンを作りたいです

お世話になります。

レコード一覧画面に、すべてのレコードを保存し直す更新ボタンを作りたいです。

各レコードに読み込んでいる関連レコード一覧を更新させるためです。

以下のTIPSを見て、ボタンの設置はできたのですが、コメントアウトしてある部分の保存のコードがわかりません。

https://developer.cybozu.io/hc/ja/articles/201767270-%E7%AC%AC2%E5%9B%9E-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7%E7%94%BB%E9%9D%A2%E3%81%AB%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86- 

ご教授いただけますでしょうか。

(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.innerText = '在庫を一括更新する';

// ボタンクリック時の処理
// myIndexButton.onclick = function() {
// window.confirm('いま押しましたね?');
// };

kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();

 

よろしくお願い致します。

mm

0

34件のコメント

Avatar
sio

mm 様
お世話になります。

>コメントアウトしてある部分の保存のコードがわかりません。

コメントアウトに記載されている部分は、
ボタンがクリックされた時に呼び出される処理と思いますので、
その処理のfunctionの中身部分を下記のように、

レコードを一括更新する処理に書き換える必要があると思います。
レコードの一括更新はこちらの記事が参考になると思います。

// ボタンクリック時の処理
my_index_button.onclick = function() {

//以下にレコードの更新処理を追加

ーーーーーーーーーーーーーーーー
var appId = kintone.app.getId();
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {app: appId}, function(resp) {

// 空更新オブジェクトの生成
 
var param = {
......
0
Avatar
mm

wenxit1218

 

お世話になります。ご丁寧にありがとうございます。

レコードの一括更新の記事もありがとうございました。参考になりました。

頂いた内容で以下のように修正してみたのですが、今度はボタンが表示されなくなってしまいました。

どこか間違っていますでしょうか?

(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.innerText = '在庫を一括更新する';

// ボタンクリック時の処理
myIndexButton.onclick = function() {

//以下にレコードの更新処理を追加

var appId = kintone.app.getId();
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {app: appId}, function(resp) {

// 空更新オブジェクトの生成


var param = {
"app": appId,
"records": []
};

for (var i = 0; i < resp['records'].length; i++) {
param['records'][i] = {
"id": resp['records'][i]['レコード番号']['value'],
"record": {}
}
}


kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
}
)

}
});
})();

よろしくお願い致します。

mm

0
Avatar
sio

mm 様
お世話になります。

kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);

上記「ボタンをspaceに表示させる」処理が、
myIndexButton.onclick = function()の中に入っているのが原因だと思います。
ボタンクリックで関数が呼び出されるまでは処理されないので、ボタンは表示されないです。

ボタンを表示させる処理をmyIndexButton.onclick = function(){}の後に置くと、
表示されるようになると思います。

  // ボタンクリック時の処理
  myIndexButton.onclick = function() {
    ......
  }
  kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
  });
})();
0
Avatar
mm

wenxit1218様

お世話になります。

myIndexButton.onclick = function() {
    ......
  }

のあとにkintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);を移動させてみたところ、

ボタンは表示されるようになったのですが、ボタンを押しても一括更新が出来ません。

他に修正する箇所はありますでしょうか。コードは以下のように修正しました。

(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.innerText = '在庫を一括更新する';

// ボタンクリック時の処理
myIndexButton.onclick = function() {

//以下にレコードの更新処理を追加

var appId = kintone.app.getId();
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {app: appId}, function(resp) {

// 空更新オブジェクトの生成

var param = {
"app": appId,
"records": []
};

for (var i = 0; i < resp['records'].length; i++) {
param['records'][i] = {
"id": resp['records'][i]['レコード番号']['value'],
"record": {}
}
}
}
)
}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();

 

よろしくお願い致します。

mm

0
Avatar
sio

mm 様

>ボタンを押しても一括更新が出来ません。

コードを確認したところ、
現状はレコードを取得するところまでの処理しかないのが原因だと思います。

パラーメータ生成するfor文の直後に、

for (var i = 0; i < resp['records'].length; i++) {
param['records'][i] = {
"id": resp['records'][i]['レコード番号']['value'],
"record": {}
}
}

PUTメソッドでレコードを更新する処理を追加する必要があります。

kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', param, function(resp) {
    // success
    console.log(resp);
}, function(error) {
    // error
    console.log(error);
});

レコードの一括更新については、下記リファレンスもご確認いただければと思います。
https://developer.cybozu.io/hc/ja/articles/201941784#step2

0
Avatar
mm

wenxit1218

お世話になります。

ありがとうございます。教えていただいたコードを追記してみたのですが、まだ動きません。

お手数ですが、ご確認いただけますでしょうか。

また、教えていただいたhttps://developer.cybozu.io/hc/ja/articles/201941784#step2 は以前確認したのですが、

この方法だと、レコードが増えるたびにコードを修正しなくてはならないので、一括でできる他の方法を探していました。共有していただいて、ありがとうございます。

(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.innerText = '在庫を一括更新する';

// ボタンクリック時の処理
myIndexButton.onclick = function() {

//以下にレコードの更新処理を追加

var appId = kintone.app.getId();
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {app: appId}, function(resp) {

// 空更新オブジェクトの生成

var param = {
"app": appId,
"records": []
};

for (var i = 0; i < resp['records'].length; i++) {
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(error);
   });
   
}
)

}
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();

 

よろしくお願い致します。

mm

0
Avatar
sio

mm 様

>各レコードに読み込んでいる関連レコード一覧を更新させるためです。

いまさらの質問で恐縮ですが、関連レコードの場合は、
関連元のデータを変更したら、関連先のアプリ情報も自動で更新されるはずですが、
カスタマイズで更新させたいのは、関連レコードの値で問題なかったでしょうか?

また、コードの方は自分の環境で動いていたので、
お手数ですが、念の為、下記記事の手順で、
https://developer.cybozu.io/hc/ja/articles/207613916
ブラウザの開発者ツールのconsoleを、確認していただいてもよろしいでしょうか?
何かエラー情報が出ていましたら教えていただけますと嬉しいです。

0
Avatar
mm

wenxit1218

お世話になります。ご返信ありがとうございます。

読み込んでいる関連レコード自体は更新されるのですが、その関連レコード内の数値を別の数値フィールドに表示されるように作っていて、

その数値フィールドは、保存をしなおさないと更新されないのです。。

consoleを確認してみたところ、エラーは特に出ていないのですが、メッセージで光っている「download.do」をクリックしたところ、

35行目の   console.log(resp); に飛ばされました。

スクリーンショットを貼りましたのでご確認いただけますでしょうか。

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

 

mm

0
Avatar
sio

mm 様

>35行目の   console.log(resp); に飛ばされました。

レコード更新が成功した時のレスポンスがこの35行の部分で取れているので、
更新処理自体はできているように見えます。

>その関連レコード内の数値を別の数値フィールドに表示されるように作っていて、

理解が間違っていましたらすみませんが、
jsカスタマイズをして、関連レコードの値を数値フィールドに表示させている、
という認識は合っていますでしょうか?

>その数値フィールドは、保存をしなおさないと更新されないのです

もしその数値フィールドのデータ表示は、jsカスタマイズで、
レコード保存するタイミングでデータを取得するような仕組みで作られていましたら、
レコード保存イベントじゃないと処理発火されないので、
空更新処理でその数値フィールドを更新させることはできないと思います。

そのため、推測ベースでの話になり恐縮ですが、
もしその数値フィールドの部分でもjsカスタマイズをしていたら、
こちらの記事を参考に、直接数値フィールド部分のjsに手を加えて
最新データを表示させる方法のほうがやりやすいかもしれません。

0
Avatar
mm

wenxit1218

お世話になります。

はい、ご認識の通りで、JSカスタマイズで関連レコードの値を数値レコードに表示させ、その数値を別の計算フィールドで計算して、

在庫数のリアルタイム更新をしたいと考えています。

(上に貼ったスクリーンショットで、一括更新ボタンを押すと、在庫数(随時更新)2となっているところに、入荷数ー在庫数(関連レコード一覧の数値)が表示されるようにしたいです。)

また、数値の取得はこちらの記事を参考にしていて、すでに完成しています。

https://developer.cybozu.io/hc/ja/community/posts/360017851006--%E7%B0%A1%E5%8D%98-query%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%9A%E3%81%AB%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8F%96%E5%BE%97-%E9%9B%86%E8%A8%88?page=1#comments

下記コードです。

(function() {
"use strict";
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit'
], function(event){
return new kintone.Promise(function(resolve){
   // まず、アプリのフィールド設定を取得しておく
RelatedRecordsFieldManager.prototype.getFieldProperties().then(function(){
    // 関連する案件一覧のレコードを取得する
(new RelatedRecordsFieldManager('関連レコード一覧')).getRecords(event.record).then(function(records){
    // 申請書アプリから数量を取得して数値に表示
event.record.数値.value = records.reduce(function(sum, record){
return sum + Number(record.p1_amt.value);
}, 0);
resolve(event);
});
});
});
});

}());

スレッド内の2019年02月13日 14:05のコメントを見て、

一覧画面に一括更新ボタンを設置する等の実装が良いかと思います.
よろしければ,下記などを参考にしてください.
https://developer.cybozu.io/hc/ja/community/posts/360017977863
https://developer.cybozu.io/hc/ja/articles/202331474#step2
https://developer.cybozu.io/hc/ja/articles/201941784#step2

とあるので、上記URLとコードは別になりますが一括更新できそうなコードを作成し、今回新たに質問をさせていただきました。

数値取得までは出来ているので、なんとか一覧画面で一括更新できる方法は無いでしょうか。

よろしくお願い致します。

mm

0
Avatar
sio

mm 様

お世話になります。
背景は理解できました。詳しく説明して頂きありがとうございます!

>一覧画面で一括更新できる方法は無いでしょうか。

仕組みは同じなので、提示していただいた下記投稿のコードで、
フィールドコード部分を変更すればできると思います。
https://developer.cybozu.io/hc/ja/community/posts/360017977863/comments/360004431671

「在庫数(随時更新)2」が「入荷数ー在庫数」の合計値という理解で問題なければ、
下記イメージになると思います。試していただいてもよろしいでしょうか。

return (new RelatedRecordsFieldManager('案件一覧')).getRecords(selfRecord).then(function(relatedRecords){
return {
id: selfRecord.レコード番号.value,
record: {
在庫数(随時更新)2のフィールドコード: {
value: relatedRecords.reduce(function(sum, relatedRecord){
return sum + Number(relatedRecord.入荷数ー在庫数のフィールドコード.value);
}, 0)
}
}
};
});
}));
0
Avatar
mm

wenxit1218様

お世話になります。

前回私の説明が少し間違っていて、

「在庫数(随時更新)2」が「入荷数ー在庫数」の合計値 ではないです。申し訳ございません。

下の図をご覧いただけますでしょうか。最終的に更新したいのは四角で囲っている在庫数(随時更新)2であっているのですが、

その内容は、(元々登録している入荷数)ー(5個ある関連レコードの数量の合計値)となります。

頂いたコードで、入荷数ー在庫数のフィールドコード.valueとありますが、存在しないので、他に何を入れたら良いでしょうか?

お手数ですがご確認いただけますでしょうか。

よろしくお願い致します。

mm

0
Avatar
sio

mm 様

お世話になります。

>入荷数ー在庫数のフィールドコード.valueとありますが、
 存在しないので、他に何を入れたら良いでしょうか?

「申請済商品数小計」は、関連レコードの「数量」の合計値という認識で問題なければ、
 前回のフィールドコードの指定を下記のように変更することで、
 更新ボタンを押したらひとつ目の「申請済商品数小計」に値は入ると思いますが、

在庫数(随時更新)2のフィールドコード → 「申請済商品数小計」のフィールドコード
入荷数ー在庫数のフィールドコード    →  関連レコードの「数量」のフィールドコード

やりたいことは、関連レコード5個分の「数量」の集計ということでしたら、
下記のようなイメージで関連レコードの個数分を集計する処理を追加し、

button.addEventListener('click', function(){
// 5つの関連レコードのフィールドコードが入る配列
var relatedRecordsFieldCodeArray = ['関連レコード一覧1',....]
// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
  // 「申請済商品数小計」のフィールドコードを下記ように定義
  var subtotal = relatedRecordsCode + "商品数小計";
Promise.all([
getRecords(kintone.app.getId()),
......

「関連レコード」と「申請済商品数小計」5つ分のフィールドコードの変数を集計処理に代入するなど、
修正を加える必要があると思います。やり方の一例ですが、ご参考になりましたら幸いです。

 //関連レコードのフィールドコードの変数を代入
return (new RelatedRecordsFieldManager(relatedRecordsCode)).getRecords(selfRecord).then(function(relatedRecords){
  return {
    id: selfRecord.レコード番号.value,
      record: {
//「申請済商品数小計」のフィールドコードの変数を代入
        [subtotal]: {
          value: relatedRecords.reduce(function(sum, relatedRecord){
            return sum + Number(relatedRecord.「数量」のフィールドコード.value);
          }, 0)
        }
      }
    };
  });
}));
0
Avatar
mm

wenxit1218

お世話になります。

どうもありがとうございます。

頂いたコードをもとに修正してみたのですが、2つ質問があります。

1. ひとつめのコードの"商品数小計"というのは何でしょうか? フィールド名にも使用していないので、どのフィールドのことか教えていただけますでしょうか。

2. ふたつめのコードの(relatedRecord.「数量」のフィールドコード.value);について、数量のフィールドコードは5つありますが、書くのは1つ目だけで良いのでしょうか。

試しに上の状態で代入してみたのですが、ボタンが表示されず

一番最後の行にUncaught SyntaxError: Unexpected end of input とエラーが表示されています。

よろしくお願い致します。

0
Avatar
sio

mm 様

お世話になります。

1. ひとつめのコードの"商品数小計"というのは何でしょうか? 

 説明不足ですみません。ループ処理がしやすいように、
「申請済商品数小計」のフィールドコードを関連レコードと紐つけて定義したく、
 下記のようなイメージで「申請済商品数小計」のフィールドコードを定義するようにしています:

「申請済商品数小計」のフィールドコード = 関連レコードフィールドコード(relatedRecordsCode)+ "申請済商品数小計"であることがわかる文字列

 例えば、関連レコードフィールドコードが"関連レコード_1"であれば、
 関連する「申請済商品数小計」フィールドコードが"関連レコード_1商品数小計"になるイメージです。

 なので、上記やり方でやる場合は、"商品数小計"部分の文字列を自由に決めて頂き、
 それで作られた文字列を「申請済商品数小計」のフィールドコードにしていただく必要があります。

2. ふたつめのコードの(relatedRecord.「数量」のフィールドコード.value);

 5つの関連レコードの関連先アプリと「数量」フィールドは全部同じもので、
 50件ずつを表示させている認識だったので、同じフィールドコードを指定してしまっていますが、
 5つの関連レコードの関連先のアプリと数量フィールドは、全部違うものでしょうか?

>一番最後の行にUncaught SyntaxError: Unexpected end of input

// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){

 上記処理を追加したのであれば、最後にも閉じ  });の追加も必要と思います。
 念のため、下記部分の処理に});が足りているかをご確認頂いても良いでしょうか?

    }).then(function(records){
       putRecords(kintone.app.getId(), records).then(function(){
         alert('更新しました。');
         location.reload();
      });
    });
  });
});
0
Avatar
mm

wenxit1218

お世話になります。

1つめについて "商品数小計"部分は、申請済商品数合計のフィールドコードにしておけばよいのですね。

2つめについては、5つの関連先アプリは同じですが、数量はそれぞれ違うものが5つあります(フィールド名は5つあります)。

以下の図のようになっています。

エラー時の処理について、教えていただいてありがとうございます。

Uncaught SyntaxError: Unexpected end of inputが表示されたときは、最後に });を追加すればよいのですね。

修正してみましたところ、一覧画面に一括更新ボタンが表示され、押すことが出来ました。

しかし、上記2の内容が違っているためか更新はされていません。

2の内容がうまく動くようにするにはどうすればよいでしょうか。

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

 

mm

0
Avatar
sio

mm 様

お世話になります。

>数量はそれぞれ違うものが5つあります

フィールドコードを変更することになりますが、「数量」も「申請済商品数合計」と同じく、
集計したい関連レコードのフィールドコードと紐付ける方法がやりやすいかもしれません。

例えば、関連レコードフィールドコードが"関連レコード_1"であれば、
関連する「申請済商品数小計」フィールドコードを"関連レコード_1商品数小計"に指定し、
関連する「数量」フィールドコードを"関連レコード_1数量"に指定するイメージです。

そのやり方の場合、「申請済商品数合計」と同じく「数量」フィールド用の変数も定義し、

button.addEventListener('click', function(){
  // 5つの関連レコードのフィールドコードが入る配列
  var relatedRecordsFieldCodeArray = ['関連レコード一覧1',....]
  // 関連レコードの個数分の集計を行う処理追加
  relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
  // 「申請済商品数小計」のフィールドコードを下記ように定義
    var subtotal = relatedRecordsCode + "商品数小計";
var quantity = relatedRecordsCode + "数量";
    Promise.all([
      getRecords(kintone.app.getId()),
      ......

その変数をその後の処理に代入する流れになると思います。ご参考になりましたら幸いです。

[subtotal]: {
          value: relatedRecords.reduce(function(sum, relatedRecord){
            return sum + Number(relatedRecord[quantity].value);
          }, 0)
        }
0
Avatar
mm

お世話になります。

すみません、理解が出来ないのですが

var subtotal = relatedRecordsCode + "商品数小計";
var quantity = relatedRecordsCode + "数量";

これは関連レコード1だけの分になりますよね。

関連レコードはあと4つあるので、

var subtotal = relatedRecordsCode + "商品数小計2";

var quantity = relatedRecordsCode + "数量2";

var subtotal = relatedRecordsCode + "商品数小計3";

var quantity = relatedRecordsCode + "数量3";

var subtotal = relatedRecordsCode + "商品数小計4";

var quantity = relatedRecordsCode + "数量4";

var subtotal = relatedRecordsCode + "商品数小計5";

var quantity = relatedRecordsCode + "数量5";

の記述はどこにも入れなくてよいのでしょうか

0
Avatar
sio

mm 様

お世話になります。

説明不足ですみません..!!

5つの関連レコードのフィールドコードが入る配列 relatedRecordsFieldCodeArray を作ったと思いますが、
その配列の5つの要素に対して、mapメソッドを使ってその後の更新処理を5回呼び出しています。
※mapメソッドについてはこちらの記事が参考になると思います:https://www.sejuku.net/blog/21812

button.addEventListener('click', function(){
// 5つの関連レコードのフィールドコードが入る配列
var relatedRecordsFieldCodeArray = ['関連レコード一覧1',....]
// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){

つまり、 relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){ の繰り返し処理の中で、
relatedRecordsCodeの中身が"関連レコード1","関連レコード2",...になっていくのにつれ、

var subtotal = relatedRecordsCode + "商品数小計";
var quantity = relatedRecordsCode + "数量";

上記の処理により、subtotal、quantityの中身も下記のように変わると思います。

"関連レコード1商品数小計","関連レコード1数量"、 "関連レコード2商品数小計","関連レコード2数量"...

なので、関連レコード_1商品数小計1""関連レコード_1数量1"、関連レコード_2商品数小計2""関連レコード_2数量2"ではなく、
関連レコードのフィールドコードだけに番号をつけるルールにすれば、
5回定義する必要はなく、全部のフィールドの更新は行われるかと思いますが、
試していただいても良いでしょうか?

0
Avatar
mm

wenxit1218

お世話になります。ご丁寧にご説明いただいて、どうもありがとうございます。

やっと意味が理解できました!! コメントアウトで書いていただいているのに理解が及ばず失礼致しました。

コード修正したところ、以下のひとつめのreturnのところにエラーが出ていて、またボタンが表示されなくなってしまいました。
    //関連レコードのフィールドコードの変数を代入
return (new RelatedRecordsFieldManager(relatedRecordsCode)).getRecords(selfRecord).then(function(relatedRecords){
    return {

また、冒頭5行目にもエラーが出ていますが、こちらは無視してもよいのでしょうか。

よろしくお願い致します。

mm

 

0
Avatar
sio

mm 様

お世話になります。
いえいえ、言葉不足で失礼いたしました。疑問が解消されてよかったです!

>以下のひとつめのreturnのところにエラーが出ていて

52~53行の部分が47~48行と重複しているようですが、おそらくそちらが原因です。
52~53行を削除した上で再度試して頂いてもよろしいでしょうか?

Promise.all([
getRecords(kintone.app.getId()),

また、最後の部分に});を追加していただいて、数的には問題ないと思いますが、
おそらくreturn event;の行数が一行ずれている気がします(77行→78行)

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

コーディングする際は,インデント(字下げ)を整理することでミスを発見しやすくなるので、
こちらの記事で使いやすいテキストエディタが紹介されているので、ぜひ確認してみてください。

>冒頭5行目にもエラーが出ていますが、

5行目で定義されているtmpRecordsの変数名が、
すでに3行目で使われている引数名と同じになっているのが原因だと思います。

こちらの記事の「レコードを取得する関数」のサンプルコードのように、
変数と引数を異なる名前で定義したほうが良いかと思います。

0
Avatar
mm

wenxit1218 様

お世話になります。

エラーの修正ありがとうございます。エディタはATOMを使用していますが、インデントのやり方や文字の色を変える方法がわからなくて、あまり使いこなせていません。。

 5行目で定義されているtmpRecordsの変数名が、
 すでに3行目で使われている引数名と同じになっているのが原因だと思います。

こちらにつきまして、

https://developer.cybozu.io/hc/ja/community/posts/360017977863 このコードをそのまま使用していて、

tmprecordsの変数名を何にすればよいのかわからなく修正が出来ないのですが、どうしたら良いでしょうか。

 

今は、一括更新を押すと「更新しました」というメッセージボックスが5回表示されます。

そして、データの更新はされません。

ためしに、作成したコードをすべて削除して手動で1つのレコードを保存し直したところ、値は更新されたので

今回作ったコードのどこかにミスがあると思います。

コンソールを見てみたところ、failed to get content script となっていました。修正する箇所がありましたら教えていただけますでしょうか。

よろしくお願い致します。

mm

0
Avatar
sio

mm 様

お世話になります。

>エディタはATOMを使用していますが、

インデントのチェックなどは、JavaScriptの構文チェックツールESLintがおすすめです。
記事に使い方の紹介もあるのでぜひ読んでみてください。

>tmprecordsの変数名を何にすればよいのか

こちらの記事の「レコードを取得する関数」のサンプルコードのように「_tmprecords」などで問題ないと思います。

vargetRecords = function(app, _tmpRecords) {
varlimit = 500;
vartmpRecords = _tmpRecords || [];

>今は、一括更新を押すと「更新しました」というメッセージボックスが5回表示されます。

現状の処理では、5つの関連レコードのデータをそれぞれ取得して、
集計フィールドの値を更新する処理を5回行うことになっています。
更新自体はできますが、5つの関連レコードの関連先アプリとレコードが同じものであれば、
一度に更新できるようにリクエストボディを編集した方が良いかもしれません。

ややこしくなってしまい申し訳ありませんが、こちらのコードをもとに、

・relatedRecordsFieldCodeArray の定義をして頂き(「商品数小計」と「計算」のフィールドコードは前回設定して頂いたまま)

 // 5つの関連レコードのフィールドコードが入る配列
var relatedRecordsFieldCodeArray = ['関連レコード一覧1',....]

・更新するリクエストボディの中身に、5つの「商品数小計」のデータが入るように編集

※やり方の一例ですが、reduce.()を使って、関連レコードの配列から、
 全部の「商品数小計」データが入るオブジェクトを作成することができます。
 reduceの使い方は、こちらが参考になると思います:
 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

return Promise.all(responses[0].map(function(selfRecord) {
return (new RelatedRecordsFieldManager(relatedRecordsFieldCodeArray[0])).getRecords(selfRecord).then(function(relatedRecords) {
return {
id:selfRecord.レコード番号.value,
record:
relatedRecordsFieldCodeArray.reduce(function(acc, elem) {
var subtotal = elem + '商品数小計';
var quantity = elem + '数量';
acc[subtotal] = {
value: relatedRecords.reduce(function(sum, relatedRecord) {
return sum + Number(relatedRecord[quantity].value);
}, 0)
};
return acc;
}, {})
};
});
}));
}).then(function(records) {
上記二点をしていただけると、一度の更新処理で5つの集計フィールドが更新されると思います。
お手数ですが、再度試して頂いてもよろしいでしょうか。
sioにより編集されました
0
Avatar
mm

wenxit1218様

 

お世話になります。

ESLintのご紹介ありがとうございました。事前準備のインストールは出来ました。

ESLintと@cybozu/eslint-configをインストールは、PowerShellでの作業でしょうか?

_tmprecordsの変数名ありがとうございます。修正致しました。

コードの修正もありがとうございました。頂いた内容で修正してみたのですが、またエラーが表示されてボタンが見えなくなってしまいました。スクリーンショットでエラーの箇所を貼りました。

以前作っていた部分は消さなくても良いのでしょうか? 以下が現状のコードになりますので、ご確認いただけますでしょうか。

 

(function() {
"use strict";
var getRecords = function(app, _tmpRecords){
var limit = 500;
var tmpRecords = _tmpRecords || [];
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: app,
query: 'limit ' + limit +' offset ' + tmpRecords.length
}).then(function(response){
tmpRecords = tmpRecords.concat(response.records);
return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
});
}
var putRecords = function(app, records){
var limit = 100;
return Promise.all(
records.reduce(function(recordsBlocks, record){
if(recordsBlocks[recordsBlocks.length - 1].length === limit){
recordsBlocks.push([record]);
}else{
recordsBlocks[recordsBlocks.length - 1].push(record);
}
return recordsBlocks;
}, [[]]).map(function(recordsBlock){
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
app: app,
records: recordsBlock
});
})
);
}
kintone.events.on('app.record.index.show', function(event){
if(document.getElementById('updateButton') !== null) return;
var button = document.createElement('button');
button.innerHTML = '一括更新';
button.id = 'updateButton';
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener('click', function(){
 
// 5つの関連レコードのフィールドコードが入る配列
var relatedRecordsFieldCodeArray = ['関連レコード一覧','関連レコード一覧_2','関連レコード一覧_3','関連レコード一覧_4','関連レコード一覧_5']
// 関連レコードの個数分の集計を行う処理追加
relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
// 「申請済商品数小計」のフィールドコードを下記ように定義
var subtotal = relatedRecordsCode + "数値";
var quantity = relatedRecordsCode + "数量";
Promise.all([
getRecords(kintone.app.getId()),
RelatedRecordsFieldManager.prototype.getFieldProperties()
]).then(function(responses){
return Promise.all(responses[0].map(function(selfRecord) {


    //関連レコードのフィールドコードの変数を代入
return (new RelatedRecordsFieldManager(relatedRecordsCode)).getRecords(selfRecord).then(function(relatedRecords){
    return {
id: selfRecord.レコード番号.value,
record: {
relatedRecordsCodeArray.reduce(function(acc, elem) {
var subtotal = elem + '数値';
var quantity = elem + '数量';
acc[subtotal] = {
value: relatedRecords.reduce(function(sum, relatedRecord) {
return sum + Number(relatedRecord[quantity].value);
}, 0)
};
return acc;
}, {})
}};
});
}));
}).then(function(records) {

   //「申請済商品数小計」のフィールドコードの変数を代入
    [subtotal]: {
value: relatedRecords.reduce(function(sum, relatedRecord){
       return sum + Number(relatedRecord.数量.value);
}, 0)
}
}
};
});
}));
}).then(function(records){
putRecords(kintone.app.getId(), records).then(function(){
alert('更新しました。');
location.reload();
});
});
return event;
});
});
});
})();

 

よろしくお願い致します。

mm

mmにより編集されました
0
Avatar
sio

mm 様

お世話になります。

>ESLintと@cybozu/eslint-configをインストールは、PowerShellでの作業でしょうか?
はい、ご認識の通りです。

>以前作っていた部分は消さなくても良いのでしょうか? 

言葉不足ですみません。
やり方を変更しているため、以前の処理は不要です。
お手数ですが、今までのコードを修正するのではなく、
こちらの元のコードをもとに、下記を編集をしていただいたほうが分かりやすいと思います。

・_tmprecordsの変数名の編集
・relatedRecordsFieldCodeArray の定義(「商品数小計」と「計算」のフィールドコードは前回設定して頂いたまま)
・更新するリクエストボディの中身に、5つの「商品数小計」のデータが入るように編集
 https://developer.cybozu.io/hc/ja/community/posts/900001438823/comments/900000841223

ご参考になれたら幸いです。

0
Avatar
mm

wenxit1218

お世話になります。

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

更新するリクエストボディとはどの箇所でしょうか? 

// 関連レコードの個数分の集計を行う処理追加relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){
// 「申請済商品数小計」のフィールドコードを下記ように定義
var subtotal = relatedRecordsCode + "数値";
var quantity = relatedRecordsCode + "数量";
Promise.all([
getRecords(kintone.app.getId()),
RelatedRecordsFieldManager.prototype.getFieldProperties()
]).then(function(responses){
return Promise.all(responses[0].map(function(selfRecord) {
の部分を全部削除すればよいでしょうか。

また、_tmprecordsの変数名は修正したのですが、上記コードで、まだ他に修正するところがありますか?

mm

mmにより編集されました
0
Avatar
sio

mm 様

お世話になります。

不要な処理は書いて頂いた部分の全部ではなく、
「relatedRecordsFieldCodeArray.map(function(relatedRecordsCode){」の一部です。
細かい修正になるため、お手数ですが元のコードから修正したほうがやりやすいかと思います。

変更箇所は、
こちらの元のコードに_tmprecordsの変数名の修正とrelatedRecordsFieldCodeArray の定義を追加し、

return Promise.all(responses[0].map(function(selfRecord) {
.....
}).then(function(records) {

上記部分に下記内容を反映すれば更新処理ができると思います。
自分の環境で更新されることは確認できました。ご参考になれたら幸いです。

return Promise.all(responses[0].map(function(selfRecord) {
  return (new RelatedRecordsFieldManager(relatedRecordsFieldCodeArray[0])).getRecords(selfRecord).then(function(relatedRecords) {
    return {
      id:selfRecord.レコード番号.value,
      record:
        relatedRecordsFieldCodeArray.reduce(function(acc, elem) {
          var subtotal = elem + '商品数小計';
          var quantity = elem + '数量';
          acc[subtotal] = {
            value: relatedRecords.reduce(function(sum, relatedRecord) {
              return sum + Number(relatedRecord[quantity].value);
            }, 0)
          };
          return acc;
        }, {})
      };
    });
  }));
}).then(function(records) {
sioにより編集されました
0
Avatar
mm

wenxit1218
お世話になっております。
ご返信ありがとうございます。
コードは新規で作り直してみることにしました。
質問なのですが、

 return Promise.all(responses[0].map(function(selfRecord) {
 .....
 }).then(function(records) {

上記部分に下記内容を反映すれば更新処理ができると思います。

の箇所で、もともと.....の箇所にあった下記のコードは消してしまって問題ないのでしょうか?

//関連レコードのフィールドコードの変数を代入
return (new RelatedRecordsFieldManager(relatedRecordsCode)).getRecords(selfRecord).then(function(relatedRecords){
    return {
id: selfRecord.レコード番号.value,
record: {
   //「申請済商品数小計」のフィールドコードの変数を代入
     [subtotal]: {
value: relatedRecords.reduce(function(sum, relatedRecord){
       return sum + Number(relatedRecord.数量.value);
}, 0)
}
}
};
});
}));

ためしに、消した状態↓にしてみたところ、下から2行目でsyntax errorが表示され、また更新ボタンが表示されなくなってしまいました。

(function() {
"use strict";
var getRecords = function(app, _tmpRecords){
var limit = 500;
var tmpRecords = _tmpRecords || [];
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
app: app,
query: 'limit ' + limit +' offset ' + tmpRecords.length
}).then(function(response){
tmpRecords = tmpRecords.concat(response.records);
return response.records.length === limit ? getRecords(app, tmpRecords) : tmpRecords;
});
}
var putRecords = function(app, records){
var limit = 100;
return Promise.all(
records.reduce(function(recordsBlocks, record){
if(recordsBlocks[recordsBlocks.length - 1].length === limit){
recordsBlocks.push([record]);
}else{
recordsBlocks[recordsBlocks.length - 1].push(record);
}
return recordsBlocks;
}, [[]]).map(function(recordsBlock){
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', {
app: app,
records: recordsBlock
});
})
);
}
kintone.events.on('app.record.index.show', function(event){
if(document.getElementById('updateButton') !== null) return;
var button = document.createElement('button');
button.innerHTML = '一括更新';
button.id = 'updateButton';
kintone.app.getHeaderMenuSpaceElement().appendChild(button);
button.addEventListener('click', function(){

// 5つの関連レコードのフィールドコードが入る配列
var relatedRecordsFieldCodeArray = ['関連レコード一覧','関連レコード一覧_2','関連レコード一覧_3','関連レコード一覧_4','関連レコード一覧_5']

return Promise.all(responses[0].map(function(selfRecord) {
return (new RelatedRecordsFieldManager(relatedRecordsFieldCodeArray[0])).getRecords(selfRecord).then(function(relatedRecords) {
return {
id:selfRecord.レコード番号.value,
record:
relatedRecordsFieldCodeArray.reduce(function(acc, elem) {
var subtotal = elem + '数値';
var quantity = elem + '数量';
acc[subtotal] = {
value: relatedRecords.reduce(function(sum, relatedRecord) {
return sum + Number(relatedRecord[quantity].value);
}, 0)
};
return acc;
}, {})
};
});
}));

}).then(function(records){
putRecords(kintone.app.getId(), records).then(function(){
alert('更新しました。');
location.reload();
});
});
});
return event;
});
})();

 

もし間違っていれば教えていただけますでしょうか。

よろしくお願い致します。

mm

0
Avatar
sio

mm 様

お世話になります。

>消した状態↓にしてみたところ、下から2行目でsyntax errorが表示され

.....の箇所にあったコードは消して頂いて問題ございません。
syntax errorはプログラムの書き方が間違っている時によく出るエラーなので、
今回の場合は、下記の行の前にあった一部のコードが漏れているのが原因かと思います。

return Promise.all(responses[0].map(function(selfRecord) {

上記行の前に、下記部分を追加していただければエラーは解消されると思います。

Promise.all([
getRecords(kintone.app.getId()),
RelatedRecordsFieldManager.prototype.getFieldProperties()
]).then(function(responses) {
0
Avatar
mm

wenxit1218様

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

Promise.allをreturn Promise.allに変更するのだと勘違いして消してしまっていました。

失礼致しました。

追加してみたところ、ボタンは表示され、関連レコードがない状態だと「更新しました」と動くのですが、

いざ関連レコード先に新規でレコードを登録すると、コードの以下の場所に「undefined」のエラーが出てしまい、更新されません。

 

51行目 relatedRecordsFieldCodeArray.reduce(function(acc, elem) {

55行目 value: relatedRecords.reduce(function(sum, relatedRecord) {

56行目 return sum + Number(relatedRecord[quantity].value);

quantityは関連レコード先の数量のフィールドコードを入れてあって、間違いないはずなのですが、何が問題なのでしょうか。

ご教授頂けますでしょうか。よろしくお願い致します。

mm

0
サインインしてコメントを残してください。