運用中のアプリに、日付フィールドの項目を追加して、
既存の項目である「年」+「月」+ 1日 を追加フィールドに更新したいです。
更新する処理を、関数にして実行したのですが、「更新者」「更新日時」が自動で更新されてしまいます。
「更新者」「更新日時」は、絞込みで使用しているため、変えたくないのですが、
良い方法はありますか?
※「作成日時」と「作成者」を絞込みに使用する、ではダメですか?
(= レコードを新規で作成した時と人)
これなら、更新しても不変です…
ダメな場合は…
①「日時」 は Date.now関数 で「現在日時」を取得
「作成者」 は 「ログインユーザー」 を取得
② 2つ の 値を取得する、❶条件❷タイミングの設定が必要ですが
-❶条件(フィールド構成によってきめる)
例)○○フィールドに値が入力されている(= 空値でないとき)
-❷保存 釦の押下げ
こんな感じでいいのではないでしょうか?![]()
添付、Gifアニメ では、わかり易くするため
❶は、保存カウンターを作り、値「2」の時と云う条件
❷は、「編集」釦の押下げをタイミングとして
Boost! Actionと云うPluginで検証してみました![]()
ご参考まで!
検証Pluginの設定画面が必要な場合は、
その旨をコメント返信頂ければスクショを貼ります

@fito12 様
ご回答ありがとうございます。
やりたいことが伝えきれていなかったようで、申し訳ありません。
更新日時を
「売上年月」項目を新規追加して、既存の項目である「売上年」+「売上月」+ 1日 で、
1回だけ、全件更新したいです。その時、赤枠部分の売上年月だけを更新したいのですが、更新日時と更新者が更新されます。
更新APIバッチ↓ 「//↓エラー」 の部分で、更新日時や更新者に値を入れようとするとエラーがでます。
(() => {
‘use strict’;
// 制御に利用するフィールドコード
const keijoYFieldCode = ‘ddw_売上年’;
const keijoMFieldCode = ‘ddw_売上月’;
const keijoDateFieldCode = ‘dat_売上年月’;
const updDtFieldCode = ‘更新日時’;
const updModifierFieldCode = ‘作成者’;// 更新するアプリID
const appIds = [41, 46];// アプリデータを取得
const fetchRecords = (appId, opt_query, opt_fields, opt_offset, opt_limit, opt_records) => {
var query = opt_query || ‘’;
var offset = opt_offset || 0;
var limit = opt_limit || 500;
var allRecords = opt_records || ;
var params = {app: appId, query: query + ’ limit ’ + limit + ’ offset ’ + offset };
if (opt_fields) params.fields = opt_fields;
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then((resp) => {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, query, opt_fields, offset + limit, limit, allRecords);
}
return allRecords;
});
};// 100件ずつに分割する関数
const splitRecords = (records, size = 100) => {
const batches = ;
for (let i = 0; i < records.length; i += size) {
batches.push(records.slice(i, i + size));
}
return batches;
};// 更新処理(100件ずつ更新を await で順次処理)
const updateAll = async (appId, records) => {
if (records.length === 0) return;const batches = splitRecords(records, 100); // 100件ずつ分割 for (const batch of batches) { // 売上年月 ← 計上年、計上月 const param = { app: appId, records: batch.map((record) => ({ id: record.$id.value, record: { 'dat_売上年月': { value: record[keijoYFieldCode].value + '-' + record[keijoMFieldCode].value + '-01' }, // ↓ エラー '更新日時': { value: record[updDtFieldCode].value }, '更新者': { value: record[updModifierFieldCode].value } // ↑ エラー } })) }; try { await kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', param); console.log('更新成功'); } catch (error) { console.error('更新失敗', error); window.alert('エラー:売上年月の更新でエラーが発生しました。' + error.message); } } return;};
// 本処理 アプリID分 データ取得→更新
const updateMultiple = async (appIds, pquery) => {
const promises = appIds.map(async (appId) => {
// データ取得
const records = await fetchRecords(appId, pquery, ‘’);
// 更新
await updateAll(appId, records);
return records.length; // ← 件数を返す
});
// 全ての更新が完了するのを待つ
const countList = await Promise.all(promises);
const totalCount = countList.reduce((sum, count) => sum + count, 0);
if (totalCount > 0) {
window.alert(更新が完了しました。更新件数は ${totalCount} 件です);
}
};let pquery = ‘’;
kintone.events.on([
‘app.record.index.edit.submit.success’
], (event) => {
// レコード一覧画面でインライン編集の【保存】をクリックした後、サーバーへの保存が成功したときのイベント
const record = event.record;
// 本処理
updateMultiple(appIds, pquery);
return event;
});
})();
一方で、このアプリの、更新履歴を取得して、過去7日間に更新された項目を一覧化するようなカスタマイズビューを作成しています。
更新日時が全件変わると、この一覧が過去7日間でなく全て対象になってしまいます。
APIは使わずに、全件削除して、全件CSV取込みすれば、更新日時と更新者は元の値をセットできるようですが、その間、運用を止める必要があり、レコード番号も変わってしまうので、悩んでいます。
何か良い手はないでしょうか?
「更新日時」「更新者」を「更新させない」とか「カスタマイズで書き換える」ことは
出来ないとおもいます
(そんなことをしたらシステムが成立しなくなると思いませんか?)
なので、カスタマイズビューの絞込み対象フィールドを変更されたらいかがでしょう?
絞込み用の
Ⓐ絞込日時フィールド と ⓐ絞込対象者(ユーザー選択フィールド)」
の各フィールドを準備
①保存 時に Ⓐ へは、 NOW関数で取得
②保存 時に ⓐ へは、ログインユーザーを取得
③APIで取り込むときは、①②は動作させない
④カスタマイズビューの 絞込み対象フィールドをⒶⓐに変更する
やっぱりできないですよね。
RDBで、トリガーを作成して、更新日時を自動更新するような感じで、
トリガーの有効/無効を切り替えにより、更新日時の更新を一時的にしないようにするような裏ワザがあればと思ったのですが、ありがとうございました。
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。


