テーブルへの値の設定と表示について

いつもお世話になっております。

「案件管理」アプリで文字列の「ステータス」を作成し、
一覧ページの表示する際に任意の文字を「ステータス」に入力したいと考えています。

下記方法で実装を行っていますが、一覧ページの「ステータス」には表示されず、空白のままです。
ただしconsole.logでみるとステータスのvalueには値は設定されていました。
consoli.tableでみるとステータスのvalueには値は設定されていませんでした。

kintone.events.on(‘app.record.index.show’, function (event) {
for(var i=0;i<event.records.length;i++)
{
event.records[i].ステータス.value = “test”;
console.log(event.records[i].ステータス.value);
console.table(event.records[i].ステータス.value);
}
return event;
});

文字列がそもそも上記のような使い方ができないのか、
別の制限等があるのかわかっておりません。
原因と対処方法を教えていただけませんでしょうか。

saka さん

たしかプロセス管理で「ステータス」が使われているため、フィールドコードに「ステータス」は、指定できません。
フィールド名には、「ステータス」を使え表示されます。
たぶん sakaさんが追加した項目のフィールドコードが別の名前になっていると思います。
実際の項目に設定されているフィールドコードを指定すれば、いいと思います。

sakaさん

rex0220さんの書かれている通り、”ステータス”のフィールドコードは使えなかった様に思います。

捕捉すると、私は、一覧表示イベントでvalueに対して、任意の値を設定したことがないので、そもそもそれが可能かがわかりません。

過去ログでは下記が近しいと思いますが、下記の回答では、DOM操作で実現されていますね。

一覧画面で一時的にフィールドの値を変更したい

https://cybozudev.zendesk.com/hc/ja/community/posts/201257414-%E4%B8%80%E8%A6%A7%E7%94%BB%E9%9D%A2%E3%81%A7%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E5%80%A4%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%81%84 

私もやってみましたが、同じくうまくいかないですね。一覧表示での値書き換えは不可なのかもしれません。

識者の方ぜひ教えてください(^^

  kintone.events.on('app.record.index.show', function (event) {

        for(var i=0;i<event.records.length;i++)

        {
                var record = event.records[i];
            record['ステータス1']['value']="test"
        }

        return event;

    });

松村さん こんにちは。

そうですね、index.show だと DOM 操作になりそうですね。

saka さん

あらためて、処理内容を見てみますと、処理の目的がよくわかりませんでした。
一覧表示するごとに、項目を初期化して表示となっていますが、どのような用途でしょうか?
実際は、何かの条件で項目を初期化したいのでしょうか?

「ステータス」項目の用途がわかれば、代替案があるかもしれません。

rex0220様、上海レンユアー 松村様

ご回答ありがとうございます。
また返信が遅くなってしまい申し訳ございませんでした。

まず「ステータス」という文字列をサンプルコード内に書いてしまい誠に申し訳ございませんでした。
実際は「次の動き」というidで作成していましたので、「ステータス」だから書き込めなかったというのはクリアしています。いただいたご回答の中では上海レンユアー 松村様のご回答が近かったです、ありがとうございます。
テーブル内のセルに表示するだけならばinnerHTMLに書き換えたらうまくいきました。

実際の問題は、この値をセットするタイミングなのかもしれません。

rex0220さんからいただいた処理の目的を明らかにした方がよいというアドバイスに繋がるのですが、
「活動報告」というアプリの「次回活動」「次回活動日」を取得し、文字列として繋げて、
この「案件管理」の一覧の「次回の活動」というセルに表示させたいということがやりたいことです。
「活動報告」までのコードを記述したものは下記になります。

kintone.events.on(‘app.record.index.show’, function (event) {

var recordNums = kintone.app.getFieldElements(‘次の動き’);

for(var i=0;i<event.records.length;i++)
{
var recordNumber = records[i].次の動き.value;
var part = recordNums[i];

var myQuery =‘案件名="’+event.records[i].案件名.value +‘"’;
var params = {app:24,query:myQuery};

kintone.api(
kintone.api.url(‘/k/v1/records’,true),
‘GET’,
params
).then(function(resp){

var rowNextActionDay =resp[‘records’][0][‘次回日付’][‘value’];
var rowNextAction = resp[‘records’][][‘次回活動’][‘value’];

part.innerHTML = rowNextActionDay + “:”+ rowNextAction;
return event.records[i];
});
}
});

活動報告アプリから値を取ってくるところはできているのですが、その値を「案件管理」のセルにセットするところがうまくいっていませんでした。

引き続きアドバイスをいただけると大変ありがたいです。

saka さん

なるほど、やりたいことがわかりました。
saka さんが感じているように、処理するタイミングを変えたほうがいいです。

現在は、案件管理アプリ一覧を表示するときに最新データを収集してセットしようとしていますが、
活動報告アプリが更新されたタイミングで、案件管理アプリの「次回の活動」を更新したほうが無駄に更新することがなくなります。

下記コードは、案件管理アプリの「案件名」がユニークキーという前提です。
アプリの項目設定が不明なので、実際の設定にあわせてください。
更新が必要かどうかの判定処理を入れるかどうかなどは、要件に合わせて検討してください。
また切り貼りしただけなので、細かなところは調整してください。

あとは、案件管理アプリの「次回の活動」を初期設定することが必要です。
件数が少なければ、マニュアルで更新、多い場合は、全件更新のスクリプト処理を別途作ったほうがいいかもしれません。

※updateKey の指定がいろいろ間違っていましたので訂正しました

// 活動報告アプリ
kintone.events.on(['app.record.index.edit.submit.success','app.record.edit.submit.success','app.record.create.submit.success'], function (event) {
var nextAction = event.record['次回日付']['value'] + event.record['次回活動']['value'];
var record = {
'次回の活動': { value: nextAction },
};
var updateKey = {
field: '案件名',
value: event.record['案件名']['value']
};

var params = {app: 案件管理のappId, record: record, updateKey: updateKey };
// レコード更新
return kintone.api(/k/v1/record', 'PUT', params);

).then(function(resp){
return event;
}).catch(function(error){
console.log('E01',error);
return event;
});
});

すいません、見直したら、updateKey の指定がいろいろ間違っていましたので訂正しました。

rex0220様

アドバイスいただいたように「活動報告」アプリで保存等をする際の処理に変更し、rex0220様のコードを利用させていただきました。結果、きちんと値が反映されるようになりました。素敵です。ありがとうございました。

保存内容を反映していないこれまでのデータについては、まだ件数も多くないので、手動で保存しなおして対応することと致しました。

今回の質問については、こちらのご回答で解決できたと思います。

rex0220様、上海レンユアー 松村様
真摯なアドバイス大変ありがとうございました。

補足ですが、

 

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

return event;
});

 

のkintoneのイベントアタッチする記述で、レコードの値の登録・変更に寄与できるイベントは、登録・編集画面にが開かれている状態のイベントだけです。具体的には次のとおりです。

・追加画面表示イベント app.record.create.show

・編集画面表示イベント app.record.edit.show

・一覧インライン編集開始時イベント app.record.index.edit.show

・追加保存前イベント app.record.create.submit

・編集保存前イベント app.record.edit.submit

・一覧インライン編集保存時イベント app.record.index.edit.submit

・追加画面フィールド変更イベント app.record.create.change.{field}

・編集画面フィールド変更イベント app.record.edit.change.{field}

・一覧インライン編集フィールド変更時イベント app.record.index.edit.change.{field}

これらのイベントはretrun eventによって、登録編集中のレコードのフィールドに値をセットできます。そして、その後保存の際に反映される感じです。

 

逆に、レコードを表示するだけの以下2つのイベントでは、文字通り表示画面ですので、return eventで値のセットしたとしても、反映するタイミングがないので、更新には寄与できないという感じです。

・一覧画面表示イベント app.record.index.show

・詳細画面表示イベント app.record.detail.show

 

更に、最近追加された、保存後イベントも app.record.detail.show と同等の表示画面でのイベントのため、値の更新には寄与できないという感じです。

 

表示系の画面において値の更新を行っているTips等で、更新処理にREST API( kintone.api() )が利用されているのは、この理屈からになります。

 

ですので、値を更新して持たせたいのか、表示が出来れば良いのかによって、対応は結構変わってきます。

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