レコード一覧画面に配置したボタンで、各レコードの値を更新したい
お世話になっております。
1ヶ月ほど前から、kintoneを利用させていただいております。
kintoneで問題集アプリを作成しました。
JavaScriptで以下の動きを実現したいのですが、
どうにもわからなくなってしまい、質問させていただきます。
■実現したい動作
レコード一覧画面に配置したボタンを押すと、
各レコードの「回答」フィールドと「正解」フィールドを見比べ、
「回答」フィールドに「正解」「不正解」を返す。
■対象アプリの構成
■作成済みのJavaScript
(1)レコード一覧に配置したボタン
(2)レコード編集画面の保存時に「回答」フィールドと「正解」フィールドを見比べ、
「正否」フィールドに「正解」「不正解」を返すスクリプト。
最終的に、(1)のボタンをクリックし、alertで「OK」が選択された際に、
全レコードに対し(2)の処理が実行されるようにしたいのですが、
ボタンを配置している「レコード一覧表示」イベントで、
フィールドの値を更新する方法がわからず、お知恵を拝借できればと思っております。
「レコード一覧表示」イベントでフィールドの値を更新する事ができれば、
for文を使って、全レコードに同じ処理を繰り返す事が可能と思っております。
JavaScript歴1週間のド素人ですので、
添付画像のスクリプトに不要な処理があったり、
この質問文にも適切でない部分があるかもしれません。
大変恐縮ですが、ご指摘いただけると幸いです。
どうぞよろしくお願いいたします。
こんにちは、私で力になれそうなので、初めての回答ですがさせていただきます。
基本的に(1)ボタンの
myIndexButton.onclick = funciton(){
}
の中に記述する形で問題ないと思います。
なので、(2)のイベント処理はfuncitonの記述内にお引越しです。
※ちなみに"app.record.edit.submit"イベントはレコード編集時の保存ボタンを押した際に走るイベントなので、(1)ボタン押下イベントではありません。
まず、更新対象となるレコードを取得するkintone REST APIのGETを使用し、取得したら条件に合わせてレコードを加工して更新するレコードを詰めていきます。
その後、PUTで各レコードを一括更新をする。でいいと思います。
kintone REST APIについては以下をご参照ください。
https://developer.cybozu.io/hc/ja/articles/202331474
軽く書いてみて動作できたので、以下ソースコードを参考にどうぞ。
2019/02/06
errorの記述が間違っていたので修正しました・・・。
(function(){
"use strict";
// 更新除外項目
var READONLY_ITEMS = [
'$id', // レコードID
'$revision', // リビジョン
'レコード番号', // レコード番号
'作成日時', //作成日時
'作成者', //作成者
'更新日時', //更新日時
'更新者' //更新者
];
// レコード一覧を表示したときのイベント
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(){
if(confirm('答え合わせしますか?')){
/**
* ここに「回答」と「正解」の値を比較し、
* 結果に応じて「正否」フィールドに「正解」「不正解」を返す動きを入れたい
*/
// リクエストパラメータ生成
var param = {
'app': kintone.app.getId()
};
// リクエストパラメータを用いてレコードを取得する
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', param).then(function(resp) {
var editRecords = [];
for(let i = 0; i < resp.records.length; i++){
let editRecord = resp.records[i];
let answer = editRecord.回答.value;
let right = editRecord.正解.value;
let recNo = editRecord['$id'].value
if(answer == right){
editRecord.正否.value = '正解';
} else {
editRecord.正否.value = '不正解';
}
// 更新対象外項目をレコードから削除する
for( let j = 0; j < READONLY_ITEMS.length; j++ ) {
delete editRecord[READONLY_ITEMS[j]];
}
editRecords.push({'id': recNo, 'record': editRecord});
}
// リクエストパラメータ生成
var body = {
'app':kintone.app.getId(),
'records': editRecords
}
return kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', body);
}).then(function(resp){
// 画面のリロード
location.reload();
return event;
}).catch(function(err){
console.log(err);
event.error = "答え合わせ実行時にエラーが発生しました。";
return event;
});
};
};
// ボタンを表示する場所をメニュー右の空白部分に設置する
kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});
})();
**w.y**様
お知恵をいただき、ありがとうございます。
いただいたソースコードに対象アプリの情報を当てはめて試させていただきたいと思います。
kintone REST API、「難しそう・・」と、手を付けていませんでした。
また「let」「catch」など、全く知らない言葉も登場し、
このスクリプトだけでも、まだまだ勉強が足りないことを痛感し、
また、楽しみに感じております。
ド素人の未熟な疑問に、ご親切にお答えいただき、本当にありがとうございます。