テーブル最終行追加方法について

下記のテーブルを用意して

テーブル名:Tコメント

フィールド名(左から):コメント、日付、ユーザー

次のプロセスボタンを押したタイミングで

別フィールド(コピー元コメント、コピー元日付、コピー元ユーザー)に

入力された内容を最終行に追加していきたいのですが、

どのようにコーディングすればよろしいでしょうか?

 

ご教授お願い致します。

 

console.logでみると値はとれているとは思うのですが、
追記されないようです。

var record = event.record;
var existing_subtable = record["Tコメント"].value; // 既存のサブテーブル
var subtable = []; // 最終的にPUTするサブテーブル
var appended_subtable = []; // 追加したいサブテーブル
//サブテーブルの内容を配列に格納
for (var i = 0; i < existing_subtable.length; i++) {
subtable.push({
"コメント": { value: existing_subtable[i].value['コメント'].value },
"日付": { value: existing_subtable[i].value['日付'].value },
"ユーザー": { value: existing_subtable[i].value['ユーザー'].value }
});
}

var recordId = kintone.app.record.getId();
var upsertParam = {
"app": targetAppId,
"id": recordId
}

~IF文~

appended_subtable.push({
"コメント": { value: comment },
"日付": { value: result },
"ユーザー": { value: kintone.getLoginUser().code }
});

subtable = subtable.concat(appended_subtable); // 既存と追加分のサブテーブルを結合

console.log(subtable);
var put_record = {}; // レコード更新用オブジェクト
put_record["Tコメント"] = {
value: subtable
};

upsertParam["record"] = put_record;

//更新処理
kintone.api("/k/v1/record", "PUT", upsertParam,function(resp){
// 成功時は画面をリロード
});

こんにちは。

https://developer.cybozu.io/hc/ja/articles/201941974#step3

プロセス管理のイベントでフィールド値の変更ができるみたいなのでこういうのはどうでしょう?

(function() {
"use strict";

let addTableFunc = function(event) {
let record = event.record;
let copyComment = record.コメントコピー.value;
let copyDate = record.日付コピー.value;
let copyUser = record.ユーザーコピー.value;

let addTable = {
"id": null,
"value": {
"コメント": {
"type": "MULTI_LINE_TEXT",
"value": copyComment
},
"ユーザー": {
"type": "USER_SELECT",
"value": copyUser
},
"日付": {
"type": "DATE",
"value": copyDate
}
}
}
record.Tコメント.value.push(addTable)
return event;
}

kintone.events.on("app.record.detail.process.proceed", addTableFunc);
})();

TK様

ご教授有難うございます。

別フィールドでコピー元からコピーしようと思ったのですが、

プロセスのタイミングでコメントアラートで入力させ、それをコピーすることにしました。

その結果、ご教授頂いた方法ですと

Uncaught (in promise) ReferenceErrorが発生したのですが、

恐らくreturn new kintone.Promiseを行っているからですか?

app.record.detail.showのタイミングで行いたいのですが、難しいでしょうか?

現状のソースは以下の通りです。

jQuery.noConflict();

(function ($) {
"use strict";




// *******************
// コメント追記処理
// *******************

// アプリID
var targetAppId = 1000;
//コメント用グローバル変数
var comment;
//画面制御用グローバル変数
var flag = 0;

//コメント入力画面表示関数
function input_comment(event) {
//非同期処理
return new kintone.Promise(function(resolve, reject) {

//コメント入力処理
var options = {
title: "コメント",
text: "コメントを記入して『コメント書き込みボタン』を押してください",
input: "textarea",
showCancelButton: true,
confirmButtonText: 'コメント書き込み',
allowOutsideClick: false
}

Swal.fire(options).then(function(result){
//コメント入力チェック
if (result.value) {
//コメント表示処理
Swal.fire({
type: 'success',
title: '書き込みは成功しました',
html: ' コメント内容:' + result.value
});
comment = result.value;
flag = 1
resolve();
}else if(result.dismiss === 'cancel'){
reject(event);
}else {
//コメント未入力
Swal.fire({
type: 'success',
title: '完了しました',
});
flag = 1;
resolve();
}
});
});

return event;
};

function update_comment(event) {
var record = event.record;
var existing_subtable = record["Tコメント"].value; // 既存のサブテーブル
var subtable = []; // 最終的にPUTするサブテーブル
var appended_subtable = []; // 追加したいサブテーブル
//サブテーブルの内容を配列に格納
for (var i = 0; i < existing_subtable.length; i++) {
subtable.push(existing_subtable[i]);
}


//コメント退避
var Finalist = record['決裁者コメント']['value'];
//日付取得
var dt = new Date();
var y = dt.getFullYear();
var m = ("00" + (dt.getMonth()+1)).slice(-2);
var d = ("00" + dt.getDate()).slice(-2);
var result = y + "-" + m + "-" + d;
//レコードID取得
var recordId = kintone.app.record.getId();
var upsertParam = {
"app": targetAppId,
"id": recordId
}

if(comment){
appended_subtable = {
"id": NULL,
"value": {
"コメント": {
"type": "MULTI_LINE_TEXT",
"value": comment
},
"ユーザー": {
"type": "USER_SELECT",
"value": kintone.getLoginUser().code
},
"日付": {
"type": "DATE",
"value": result
}
}
}

subtable = subtable.concat(appended_subtable); // 既存と追加分のサブテーブルを結合

var put_record = {}; // レコード更新用オブジェクト
put_record["Tコメント"] = {
value: subtable
};


upsertParam["record"] = put_record;

//更新処理
kintone.api("/k/v1/record", "PUT", upsertParam,function(resp){
// 成功時は画面をリロード
// location.reload(true);
});
}
return event;
};

//プロセスのアクション実行前イベント
var ProcessEvents = ["app.record.detail.process.proceed"];
//レコード詳細表示イベント
var ProcessEvents2 = ["app.record.detail.show"];

kintone.events.on(ProcessEvents, input_comment);
kintone.events.on(ProcessEvents2, update_comment);
})(jQuery);

ちょっとよく動きが理解できてないのですが、

https://developer.cybozu.io/hc/ja/articles/204564604

公式を見る限りapp.record.detail.showではPromiseは対応してませんね。

https://developer.cybozu.io/hc/ja/community/posts/360043360491-mobile-app-record-detail-show%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E6%99%82%E3%81%ABPromise%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%81%84

このあたり参考になるかと!

TK様

うまく説明できず申し訳ありません。

app.record.detail.process.proceedのタイミングではなく、

app.record.detail.process.proceed後のapp.record.detail.showのタイミングで追記処理をしたかったのです。

(app.record.detail.process.proceedはコメントを入力するだけの処理で追記処理はapp.record.detail.show)

サブテーブルでなければ問題なくできているのですが、サブテーブルには最終行に追記できいないのです。

concole.logでupsertParamをみたところ問題なく入っているようなのですが・・・

 

今回実装したい流れは下記の通りです。

①プロセスボタン押したタイミングでテキストエリア付のアラートが表示されコメントを入力。

②コメントを入力された場合、Tコメントのサブテーブルの最終行に入力したコメントを表示したい。

※過去のコメントは残したい

 

もう少し考えて見てダメそうであれば全体的に見直します。