app.record.index.show'  でエラーとなります。

みなさま

以下のようなスクリプトを作成したのですが、
期待した動きができず困っております。

 

■実現したいこと
各日付の状態によってステータスを変更したいです。
(例)作業開始日が未来の日程であれば、ステータスは「発注済」
作業開始日が本日以降であれば、ステータスは「作業中」 などです。

vlOrder = 発注日
vlStart = 作業開始日
vlEnd = 作業終了日

■スクリプト
/* ---------------------------------------------------------------------------------
(1)ステータスの自動変更
------------------------------------------------------------------------------------*/

var statusChangeIndex = [‘app.record.index.show’,
‘app.record.index.edit.show’,
‘app.record.index.edit.change.workStartDate’,
‘app.record.index.edit.change.progressStatus’,
‘app.record.index.edit.change.workEndDate’,
‘app.record.index.edit.change.orderDate’];

kintone.events.on(statusChangeIndex, function(event) {

var vlOrder = record[‘orderDate’][‘value’];
var vlStart = record[‘workStartDate’][‘value’];
var vlEnd = record[‘workEndDate’][‘value’];

var date = moment();
var now = moment(date).format(‘YYYY-MM-DD’);
var record = event.record;

if (!(vlOrder) && !(vlStart) && !(vlEnd)) {
record[‘progressStatus’].value = ‘未発注’;

} else if (vlEnd) {
record[‘progressStatus’].value = ‘作業完了’;

} else if ((vlStart) <= now ) {
record[‘progressStatus’].value = ‘作業中’;

} else if (vlOrder) {
record[‘progressStatus’].value = ‘発注済’;
}
return event;
});

■困っていること

‘app.record.index.show’ = 一覧の参照画面でエラーとなります。
//‘app.record.index.show’ と一覧参照の部分をコメントを外すとエラーは出ません。
一覧画面で、値を参照できていないのが原因かと思いますが、対処方法がわかりません。

■コンソールのエラーメッセージ
Uncaught TypeError: Cannot read property ‘orderDate’ of undefined

以上、アドバイスの程よろしくお願いいたします。

Sophia さん

エラーコードの原因は、ご推察の通り値が参照できていません。

index.show は record を配列で返すので値を参照したい場合には

var record = event.records;

//orderDate の取得
var vlOrder = record[0]['orderDate']['value"];

このように指定しなければなりません。

index.show を event の中にまとめるとどうしても、他の event でとる値の

var vlOrder = record['orderDate']['value'];
var vlStart = record['workStartDate']['value'];
var vlEnd = record['workEndDate']['value'];

この三つを読み込もうとしてしまい、中身がないとエラーが吐き出されるので

index.show だけの event処理を加えてみてはどうでしょうか。

yogi様

アドバイスありがとうございます。

こちらのスクリプトを作成しましたが、エラーとなります。
Uncaught TypeError: Cannot read property ‘length’ of undefined

配列の扱い方に誤りがあるかと思いますが、解決に至っておりません。

各レコードの [発注日]  [作業開始日]   [作業終了日]  を取得して処理したいです。

重ねての質問となりますが、アドバイス頂けますと幸いです。

 

//一覧画面(index.show)での処理

kintone.events.on(['app.record.index.show'], function(event) {
 for (var i = 0; i < record.length; i++) {
 var record = event.record[i];

 var date = moment();
 var now = moment(date).format('YYYY-MM-DD');
 var vlOrder = record[i]['orderDate']['value'];
 var vlStart = record[i]['workStartDate']['value'];
 var vlEnd = record[i]['workEndDate']['value'];


record['progressStatus']['disabled'] = true;

 if ((!vlOrder) && (!vlStart) && (!vlEnd)) {
  record['progressStatus'].value = '未発注';

 }else if(((vlOrder) && (!vlStart)) || ((vlOrder) && ((vlStart) > (now)))) {
  record['progressStatus'].value = '発注済';

 }else if((vlOrder) && ((vlStart) <= (now)) && (!vlEnd)) {
  record['progressStatus'].value = '作業中';

 }else if (vlEnd) {
  record['progressStatus'].value = '作業完了';
 }
 return event;
}
});

 

Sophia さん

その状態だと record が定義される前に record.length を使う処理になっているので

var record = event.records;

を for文の中ではなく、始まる前に書いてください。

注意として event.record では 中身がない状態になるので event.records と書いてください。

record の中に配列として中身が入るので、for文の中の処理も通ると思います。

yogi様

 

ありがとうございます。

色々と手探りの中で、 for 文の前に

var record = event.records;

を設定したパターンを試したつもりでしたが、意味も分からずに  event.records ではなく、event.record としておりました。

var record = event.record;

 

配列の値を取得したい場合は records としなければならない理由などが書かれた

ドキュメントはありますでしょうか?

 

以上、よろしくお願いいたします。

 

Sophia さん

配列の値を取得したい場合、というよりは app.record.index.show のレコードが配列として渡されるって感じですかね。

index.show のドキュメントはこちらに

他のイベントのドキュメントを見たい場合は イベント一覧 のページもあるので

ぜひご活用ください。

yogi様

度々ありがとうございます。
リンクのドキュメントを確認いたしました。それぞれのアクションに応じたオブジェクトのプロパティがあるとのことなんですね。
※ app.record.index.show の場合は records は正しいが、 record は利用できない。 など

本件に戻りますが、スクリプト修正後、コンソール上にエラーはでなくなったのですが、

想定する動きをしておりません。

■想定する動き

一覧画面を開いた際にステータスの状況が if文 で設定した通りに変更されている。

(具体例)

・6/22にURLにアクセスした際、あるレコードのステータスは「発注済」

・6/23になると、URLにアクセスした際、上記のレコードのステータスは「作業中」となっている。

です。

 

■実際の状況

あるレコードが以下のように設定されてます。

vlOrder = record[i][‘orderDate’][‘value’]; →発注日:2018-06-20
vlStart = record[i][‘workStartDate’][‘value’]; →開始日:2018-06-23

6/22時点では

if文の以下の条件に合致し、ステータス(progressStatus)は「発注済」となっておりました。

}else if(((vlOrder) && (!vlStart)) || ((vlOrder) && ((vlStart) > (now)))) {
  record[i]['progressStatus'].value = '発注済';

 

6/23になって、一覧画面を参照した場合は、以下の条件に合致し
ステータスが「作業中」と変わることを期待

}else if((vlOrder) && ((vlStart) <= (now)) && (!vlEnd)) {
record[i]['progressStatus'].value = '作業中';

 

■実際の挙動

しかし、実際は6/23になっても、一覧画面参照時にステータスは「発注済」のままでした。
スクリプトの作りに問題はございますでしょうか?

—一覧画面参照時のconsoleの出力—

2018-06-23
【order(indexShow)】 null
【Start(indexShow)】 null
【End(indexShow)】 null

 

--- スクリプト ---------------
//一覧画面(index.show)での処理


kintone.events.on(['app.record.index.show'], function(event) {
var record = event.records;

for (var i = 0; i < record.length; i++) {

var date = moment();
var now = moment(date).format('YYYY-MM-DD');
var vlOrder = record[i]['orderDate']['value'];
var vlStart = record[i]['workStartDate']['value'];
var vlEnd = record[i]['workEndDate']['value'];

//以下はデバック用途
console.log(now);
console.log("【order(indexShow)】 " + vlOrder);
console.log("【Start(indexShow)】 " + vlStart);
console.log("【End(indexShow)】 " + vlEnd);


if ((!vlOrder) && (!vlStart) && (!vlEnd)) {
record[i]['progressStatus'].value = '未発注';

}else if(((vlOrder) && (!vlStart)) || ((vlOrder) && ((vlStart) > (now)))) {
record[i]['progressStatus'].value = '発注済';

}else if((vlOrder) && ((vlStart) <= (now)) && (!vlEnd)) {
record[i]['progressStatus'].value = '作業中';

}else if (vlEnd) {
record[i]['progressStatus'].value = '作業完了';
}
return event;
}
});

 

重ね重ねすみませんが、アドバイスをお願いいたします。

 

追記させていただきます。

スクリプトを一部修正したところ、各レコード事に値を参照できるようになり、

console.log での null の現象は改善しましたが、

一覧参照画面でのステータス変更の処理が動きません。 if文が動作しません。

改善の為のアドバイスを頂けますと幸いです。

 

■スクリプトの改善点

→ return event; の位置が間違っておりました。

}else if (vlEnd) {
record[i]['progressStatus'].value = '作業完了';
}
return event;
}
});

でなく、以下のように修正 (for文の外に return event を移動しました)

}else if (vlEnd) {
record[i]['progressStatus'].value = '作業完了';
}
}
return event;
});

Sophia さん

レコードの更新をしたい場合は REST API の PUT を使用してください。

REST API はチュートリアルの第9回~第11回にも簡単な処理があるので参考にしてみてください。

yogi 様

 

ご確認ありがとうございます。

ご紹介いただきましたURLを参考にさせていただきます。

以上、よろしくお願いいたします。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。