添付ファイルを登録すると、ステータスを変更するプログラムは可能でしょうか?

ドロップダウンのフィールドに「未発注」「見積提出済」「作業完了」・・・

などの登録を行い、さらに日付のフィールドに「依頼日」「発注日」「作業完了日」・・・ などの設定をしております。

 

例えば、「作業完了日」(日付フィールド)に日付を登録すると、

ステータス(ドロップダウン)の内容を「作業完了」に変更する

スクリプトを作成しましたが、この中で添付ファイルのフィールドに

添付ファイルが登録されると、ステータス(ドロップダウン)の

内容を変更することは可能でしょうか?

以下のスクリプトでは実現できませんでした。

 

/*---------------------------------------------------------------------------------
ステータスの自動変更

-----------------------------------------------------------------------------------*/

var statusChange1 = [‘app.record.create.show’,
‘app.record.create.change.quotation’,
‘app.record.create.change.orderDate’,
‘app.record.create.change.progressStatus’,
‘app.record.create.change.workEndDate’,
‘app.record.create.change.workStartDate’,
‘app.record.detail.show’,
‘app.record.edit.show’,
‘app.record.edit.change.quotation’,
‘app.record.edit.change.orderDate’,
‘app.record.edit.change.progressStatus’,
‘app.record.edit.change.workEndDate’,
‘app.record.edit.change.workStartDate’];

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

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

var vlOrder = record[‘orderDate’][‘value’];
var vlStart = record[‘workStartDate’][‘value’];
var vlEnd = record[‘workEndDate’][‘value’];
var vlQuot = record[‘quotation’][‘value’].length;

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

record[‘progressStatus’][‘disabled’] = true;

if (vlEnd) {
record[‘progressStatus’].value = ‘作業完了’;
} else if (vlStart) {
record[‘progressStatus’].value = ‘作業中’;
} else if (vlOrder) {
record[‘progressStatus’].value = ‘発注済’;
} else if (vlQuot >= 1) {
record[‘progressStatus’].value = ‘見積提出済’;
} else {
record[‘progressStatus’].value = ‘未発注’;
}
return event;
});


 

https://developer.cybozu.io/hc/ja/community/posts/202896454-%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%95%B0%E3%81%AE%E5%8F%96%E5%BE%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

の情報をみつけたのですが、何か実現方法があればアドバイス願います。

Sophia様

お世話になっております.
cstapの江田です.

保存成功後イベントを利用するとよいと思います。
https://developer.cybozu.io/hc/ja/articles/201941984#success

(function(){"use strict";kintone.events.on(['app.record.create.submit.success','app.record.edit.submit.success',],function(event){if(!event.record.添付ファイル.value.length)return;returnkintone.api(kintone.api.url('/k/v1/record',true),'PUT',{app:kintone.app.getId(),id:event.recordId,record:{ステータス:{value:'\*\*\*\*\*'}}});});})();

江田様

 

アドバイス頂きました内容で実現できました。

ありがとうございます。

 

 

 

 

度々申し訳ございません。

以前アドバイス頂き、一見解決したように思えたのですが、

意図した動きをしていないことが判明しました。

 

<意図しない動き>

たとえ、vlEnd (完了日) に値が入っていても、添付ファイルが添付されていると

ステータスが「見積提出済」となってしまします。

 

‘app.record.create.submit.success’, と ‘app.record.edit.submit.success’, のタイミングで

以前、教えていただきました api が有効化されてしまっていることまでは理解できました。

if文の中でこの api を呼び出し、 if 分が上から実行されることで意図した動きができるか

アドバイスの程、お願いいたします。

 

record[‘progressStatus’][‘disabled’] = true;

if (vlEnd) {
record[‘progressStatus’].value = ‘作業完了’;
} else if (vlStart) {
record[‘progressStatus’].value = ‘作業中’;
} else if (vlOrder) {
record[‘progressStatus’].value = ‘発注済’;

 

}else if (xxxxxxxxxxxxxxx) {

record[‘progressStatus’].value = ‘見積提出済’; <---- この部分で処理させたいです

 

} else {
record[‘progressStatus’].value = ‘未発注’;
}
return event;
});

 

 

 

 

 

 

/*---------------------------------------------------------------------------------
(1)ステータスの自動変更
------------------------------------------------------------------------------------*/

var statusChange1 = ['app.record.create.show',
'app.record.create.submit.success',
'app.record.edit.submit.success',
'app.record.create.change.orderDate',
'app.record.create.change.progressStatus',
'app.record.create.change.workEndDate',
'app.record.create.change.workStartDate',
'app.record.detail.show',
'app.record.edit.show',
'app.record.edit.change.orderDate',
'app.record.edit.change.progressStatus',
'app.record.edit.change.workEndDate',
'app.record.edit.change.workStartDate'];


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

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

var vlOrder = record['orderDate']['value'];
var vlStart = record['workStartDate']['value'];
var vlEnd = record['workEndDate']['value'];
var vlQuot = record['quotation']['value'].length;

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


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

if (vlEnd) {
record['progressStatus'].value = '作業完了';
} else if (vlStart) {
record['progressStatus'].value = '作業中';
} else if (vlOrder) {
record['progressStatus'].value = '発注済';
} else {
record['progressStatus'].value = '未発注';
}
return event;
});

/*-------------------- 添付ファイルがある場合、「見積提出とする」 ---------- #2019/02/21 -------*/
kintone.events.on([
'app.record.create.submit.success',
'app.record.edit.submit.success',
], function(event){
if(!event.record.quotation.value.length) return;
return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', {
app: kintone.app.getId(),
id: event.recordId,
record: {
progressStatus: {value: '見積提出済'}
}
});
});

Sophia様

お世話になっております.

仰る通り,条件を追加すればよいと思います.

kintone.events.on(['app.record.create.submit.success','app.record.edit.submit.success',],function(event){if(!event.record.quotation.value.length)return;if(event.record.progressStatus.value==='作業完了')return;if(event.record.progressStatus.value==='作業中')return;if(event.record.progressStatus.value==='発注済')return;if(event.record.progressStatus.value==='見積提出済')return;returnkintone.api(kintone.api.url('/k/v1/record',true),'PUT',{app:kintone.app.getId(),id:event.recordId,record:{progressStatus:{value:'見積提出済'}}});});

※コード修正しました.

江田様

 

後日確認をさせて頂きます。

早々のアドバイス、本当にありがとうございす。

引き続きの件となります。

前回アドバイス頂いた方法で運用的に不具合があることが判明しました。

■不具合内容
kintoneのレコード詳細画面を開き、保存が成功した際に
スクリプトが稼働するため、レコードを編集・保存のたびに
quotationSubmitDate(見積提出日)のフィールドの日付も更新されてしまいます。

そこで、方式を以下のロジックに変更しスクリプトを2つに分けました。

<Step(1-1)>
・event.record.quotation.value.length === 0 → 添付ファイルがなし
・vlQuot === null → 「見積提出日」フィールドが空白
上記の場合に、「見積提出日」に now をPUTする。

<Step(1-2)>
ステータス(progressStatus)の自動入力の際に、上段の条件から判定させる
vlEnd(完了日フィールド)に値が入力されている場合 → 作業完了
vlStart(作業開始日フィールド)に値が入力されている場合 → 作業中
vlOrder(発注日フィールド)に値が入力されている場合 → 発注済
vlQuot(見積提出日フィールド)に値が入力されている場合 → 見積提出済
それ以外 → 未発注

javascriptのプログラムを添付のように <Step(1-1)> の下に <Step(1-2)> を記載
しているのですが、ブラウザで処理のログを確認すると (1-2)が先に実行されてしまうため
意図した動きとなりません。
→ 保存ボタンを押下した際に、はじめにステータスの判定(1-2)が動き、
その後、見積提出日が入力(1-1)の為、添付ファイルがあるにも関わらず、
ステータスが”未発注”のままであったりします。

解決策として、必ず 1-1 を実行した後に 1-2 を実行させることは可能でしょうか?

 

/*---------------------------------------------------------------------------------
(1)ステータスの自動変更
------------------------------------------------------------------------------------*/

/*---------- (1-1)添付ファイルがある場合、「見積提出日」 に本日の日付をPUT -- #2019/02/26 ------*/

kintone.events.on([
'app.record.create.submit.success',
'app.record.edit.submit.success'
], function(event){

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

var vlSubmit = record['submitDate']['value'];
var vlQuot = record['quotationSubmitDate']['value'];
var vlOrder = record['orderDate']['value'];
var vlStart = record['workStartDate']['value'];
var vlEnd = record['workEndDate']['value'];

//以下はデバック用途
console.log("");
console.log("【Quotation】(1-1): " + vlQuot);
console.log(event.record.quotation.value.length);

if((event.record.quotation.value.length === 0) && (vlQuot === null )) return;

return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', {
app: kintone.app.getId(),
id: event.recordId,
record: {
quotationSubmitDate: {value: now},
}
});
});

/*-------------------- (1-2)入力されている日付に応じてステータス変更する ------------*/


var statusChange1 = [
'app.record.create.submit',
'app.record.edit.submit'];

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

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

var vlSubmit = record['submitDate']['value'];
var vlQuot = record['quotationSubmitDate']['value'];
var vlOrder = record['orderDate']['value'];
var vlStart = record['workStartDate']['value'];
var vlEnd = record['workEndDate']['value'];

//以下はデバック用途
console.log("");
console.log("(1-2):" + now);

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

if (vlEnd) {
record['progressStatus'].value = '作業完了';
} else if (vlStart) {
record['progressStatus'].value = '作業中';
} else if (vlOrder) {
record['progressStatus'].value = '発注済';
} else if (vlQuot) {
record['progressStatus'].value = '見積提出済';
} else {
record['progressStatus'].value = '未発注';
}
return event;
});

Sophia様

お世話になっております.
返信遅くなりました.

前回書いた条件式,間違っていました.
申し訳ございません.

(1-1)「app.record.???.submit」は保存実行前イベント,(1-2)「app.record.???.submit.success」は保存成功後イベントですので,(1-1)→(1-2)は不可能です.

「progressStatus」を「見積提出済」にするタイミングで,「quotationSubmitDate」を「now」にすればよいのではないでしょうか」?

kintone.events.on(['app.record.create.submit','app.record.edit.submit',],function(event){varrecord=event.record;varvlSubmit=record['submitDate']['value'];varvlQuot=record['quotationSubmitDate']['value'];varvlOrder=record['orderDate']['value'];varvlStart=record['workStartDate']['value'];varvlEnd=record['workEndDate']['value'];if(vlEnd){record['progressStatus'].value='作業完了';}elseif(vlStart){record['progressStatus'].value='作業中';}elseif(vlOrder){record['progressStatus'].value='発注済';}elseif(vlQuot){record['progressStatus'].value='見積提出済';}else{record['progressStatus'].value='未発注';}returnevent;});kintone.events.on(['app.record.create.submit.success','app.record.edit.submit.success'],function(event){if(!event.record.quotation.value.length)return;if(event.record.progressStatus.value==='作業完了')return;if(event.record.progressStatus.value==='作業中')return;if(event.record.progressStatus.value==='発注済')return;if(event.record.progressStatus.value==='見積提出済')return;varnow=moment().format('YYYY-MM-DD');returnkintone.api(kintone.api.url('/k/v1/record',true),'PUT',{app:kintone.app.getId(),id:event.recordId,record:{progressStatus:{value:'見積提出済'},quotationSubmitDate:{value:now}}});});

江田様

 

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

実は、運用が始まってしまっており、今回のスクリプトでの制御は一旦見送り

自動での処理を行わずにリリースをしております。

後日、内容について確認(勉強)いたします。