新規投稿
フォローする

プロセス管理処理履歴のサブテーブル作成について

お世話になります。

下記の記事を参考に、プロセス管理で処理が実行されたときに、レコード内のサブテーブルへ処理履歴を残す機能を実装しようとしていますが、上手く動きません。

おそらく初歩的なミスばかりだと思いますが、どこをどう修正すればよいか、アドバイスいただけないでしょうか。

 

テーブルに値をコピーする際のテーブル操作についてhttps://developer.cybozu.io/hc/ja/community/posts/115019185003-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E5%80%A4%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E6%93%8D%E4%BD%9C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

 

(function () {
"use strict";

function isEmptyRow(tableRow){
var result = true;
for(var key in tableRow){
if(typeof tableRow[key].value === 'object'){
if(tableRow[key].value.length !== 0){
result = false;
}
}else if(typeof tableRow[key].value !== 'undefined'){
result = false;
}
}
console.log(result);
return result;
}

kintone.events.on(["app.record.detail.process.proceed"], function(event){
var record = event.record;

if(isEmptyRow(record.Table_a.value[0].value)){
record["Table_a"].value[0].value["日時"].value = record["更新日時"].value;
record["Table_a"].value[0].value["ステータス_履歴"].value = event.nextStatus.value;
record["Table_a"].value[0].value["作業者_履歴"].value = record["更新者"].value;
record["Table_a"].value[0].value["アクション"].value = event.action.value;
record["Table_a"].value[0].value["コメント"].value = record["コメント"].value;

}else{
var addData = {};
addData.value = {};

addData.value["日時"] = {
type: "DATE",
value: record["更新日時"].value
};

addData.value["ステータス_履歴"] = {
type: "SINGLE_LINE_TEXT",
value: event.nextStatus.value
};

addData.value["作業者_履歴"] = {
type: "SINGLE_LINE_TEXT",
value: record["更新者"].value
};

addData.value["アクション"] = {
type: "SINGLE_LINE_TEXT",
value: event.action.value
};

addData.value["コメント"] = {
type: "SINGLE_LINE_TEXT",
value: record["コメント"].value
};

record["Table_a"].value.push(addData);
}
return event;
});
})();

 

 

0

8件のコメント

Avatar
Asami

nagayamaさん、こんにちは。

うまく動かないのはどのあたりか、をデバッグで判別してから投稿して頂いたほうがアドバイスがしやすいです。
デバッグのやり方はこちらが参考になります。
https://developer.cybozu.io/hc/ja/articles/207613916

ざっと見て気になったのは

  1. 「コメント」というフィールドのフィールドコードを再確認してください。
    テーブル外にある「コメント」フィールドからテーブル内の「コメント」フィールドへ値をコピーしようとしていますが、
    1つのフォームでフィールドコードが重複する2つのフィールドを配置することはできないので、
    この部分はどちらかのフィールドコードが間違っているかと思います。
  2. 「更新者」フィールドがデフォルトの更新者フィールドを指しているのであれば、valueの中のnameを取らないと
    ユーザー名は取れないと思います。
    フィールド形式に合った形で処理しているか確認してみてください。
    https://developer.cybozu.io/hc/ja/articles/202166330
0
Avatar
nagayama

Asami様

ご回答ありがとうございます。

まず、「コメント」と「更新者」の2点について、修正いたしました。

デバッグを実行したところ、

if(isEmptyRow(record.Table_a.value[0].value)){

上記の箇所で、

Uncaught TypeError: Cannot read property 'value' of undefined

となりますが、対処が分かりませんので、アドバイスいただけると幸いです。

 

0
Avatar
たまご

エラーの出ている箇所にブレークポイントを置いて、「record.Table_a」が取得できているか確認してみてください。
取得できていなければ、テーブルコードが間違っている可能性があります。

0
Avatar
nagayama

たまご様

ありがとうございます。

色々切り分けなどを実施した過程で、テーブルコードが間違っていました。申し訳ありません。

ひとまずこれでテーブルにレコードは入りましたが、テーブルの2行目以降に入り、1行目はブランクのままです。

下記の部分でテーブルに行があるかないかをチェックしていますが、行が無い状態で実行しても、resultがfalseとなってしまう、

つまり行があると判定されてしまいます。

日時フィールドが考慮できていない気がしていますが、具体的にアドバイスをいただけると助かります。

function isEmptyRow(tableRow){
var result = true;
for(var key in tableRow){
if(typeof tableRow[key].value === 'object'){
if(tableRow[key].value.length !== 0){
result = false;
}
}else if(typeof tableRow[key].value !== 'undefined'){
result = false;
}
}
console.log(result);
return result;
}

 

0
Avatar
たまご

テーブル1行目の入力有無を確認している箇所ですね。
tableRow[key].value にブレークポイントを置いて、どのような値が入ってくるのかを確認してみてください。

日時フィールドと文字列1行のみなのであれば、未入力の場合すべて "" になっているかと思います。(undefinedじゃないですね)
ついでに、1箇所でも入力されているフィールドがあったら次の行に出力したいので、
入力済フィールドがあったらresultをfalseにしてすぐにループを抜けましょう。

function isEmptyRow(tableRow) {
var result = true;
for (var key in tableRow) {
if (tableRow[key].value !== '') {
result = false;
break;
}
}
console.log(result);
return result;
}

※チェックボックスとか使う場合はvalueに配列が入ってくるので、先ほどのコードの type of での判定を入れる必要があります。

これでどうでしょうか。試してみてください^^

0
Avatar
nagayama

たまご様

ありがとうございます。

アドバイスいただいたとおり実装したところ、テーブル1行目の入力有無確認が意図通り動作しました。

 

立て続けで恐縮ですが、別の箇所で、意図通り動作しない箇所があります。

テーブルの"日時"フィールドですが、意図としては、プロセス管理のアクション実行時の日時を入力したいのですが、

アクション実行前の直近のレコード更新日時が入ってしまします。

プロセス管理のアクション実行時の日時を入力にはどうしたらよいか、アドバイスをいただけると幸いです。

0
Avatar
たまご

nagayamaさん、おはようございます!

先日のコードだと、フォームに保存されている更新日時を取得してテーブルにセットしているので、そのような挙動になりますね。

「プロセス管理のアクション実行時の日時を入力」ということですので、JavaScriptの処理内で現在時刻を取得して
テーブルの日時フィールドへセットすれば可能です。

下記のTipsが参考になりそうです。
https://developer.cybozu.io/hc/ja/articles/202181714

0
Avatar
nagayama

たまご様

ご回答ありがとうございます。

アドバイスいただいたとおり、現在時刻を取得し日時へセットする方法を実装し、希望どおりの機能が完成しました。

色々とご教示いただき、ありがとうございました。

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