追加した項目の初期値を過去のデータへ一括入力するにはどうすれば良いでしょうか。

計算フィールドは問題なく一括更新できるようになったのですが、例えば、フォームを追加し、初期値設定をした場合、追加前のレコードの値を初期値になるよう一括入力する方法はあるのでしょうか。

NSさん

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

> 計算フィールドは問題なく一括更新できるようになった
こちらは、REST APIで更新しているということでしょうか?
計算フィールドについては、空更新で自動的に計算が行われているのかと思います。
その他のフィールドについては、明示的に値を指定すれば良いかと思います。
https://developer.cybozu.io/hc/ja/articles/201941784#step2
https://developer.cybozu.io/hc/ja/articles/204537310

初期値の値を動的に取得したいということであれば、フォームの設定の取得APIを用いれば良いかと思います。
https://developer.cybozu.io/hc/ja/articles/204783170

江田様

返信が遅くなり、申し訳ございません。
ご丁寧にありがとうございます。

REST APIで更新しています。
空更新で探して見つけたコードを内容がわからないまま、
コピペして利用しているので、具体的に何をしているのか、
ほぼわからないですが・・・

初期値の反映は「properties.(フィールドコード).defaultValue」を、
値に指定すれば良いのですね。ありがとうございます。

この場合、新たに追加された項目だけ、初期値を入力するということは、
可能なのでしょうか。

例:
項目A・・・初期値入力済み
項目B・・・初期値ではない値入力済み

この状態のデータが200件あったとして、

項目A・・・初期値入力済み
項目B・・・初期値ではない値入力済み
項目C・・・新規追加した項目で、全データの一括して初期値を反映する。

このようなことを行うのですが、
項目の増減がたびたび起こるので、毎回コードを編集せず、
追加された項目のフィールドコードを自動的に取得して、
初期値を反映するというのは、可能でしょうか。

質問が重なり、申し訳ございません。
お手すきであればでかまいませんので、教えていただけると嬉しいです。

 

NSさん

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

propertiesの各プロパティについて処理を行うようなコードにしておけば、可能かと思います。

Object.values()などを用いてpropertiesを配列化して、ループ処理させるといった方法があるかと思います。

江田様
ありがとうございます。

私の知識が追いつかないのですが、流れとしては、
①新規追加された項目だけを見つける。
②①の項目が空白だった場合、初期値を指定。
ということでしょうか。

NSさん

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

認識がずれていました。申し訳ございません。

①はなく
②’空白のフィールドはすべて、初期値を指定。
という認識でした。

すべての空白のフィールドに初期値が入力されるのが困るという場合は、仰る通り過去のフォーム設定と比較する必要がありますね。
フォームの設定の取得APIでは過去のフォーム設定は取得できなそうなので、工夫が必要ですね。

初期値の入力処理をする際に、その時点で存在しているフィールドコードを保存しておく(保存先は、別に用意したアプリなど)
次に初期値の入力処理をする際は、保存したフィールドコードと現在のフォーム設定を比較する

というのはいかがでしょうか?

江田様

ご丁寧にありがとうございます!

初期値を外して、空白にするような使い方をするフィールドが無い限り、
元々初期値設定がない(初期値設定無し=空白が初期値だと思っています)場合、
全ての空白に初期値を設定しても問題ない気がするので、
空白のフィールドはすべて、初期値を指定というのでも大丈夫かもしれないです。

私は知識が追いつかず、まだプログラムをどうやってかけば良いかわかりませんが、
以下のような流れでしょうか。

①全てのフィールドから、空白のフィールドを探し、
フィールドコードを配列に格納する。

②配列に格納したフィールドコードを1つずつ取り出し、
初期値を指定する。(初期値の設定が無い場合、空白のまま)

恐縮ですが、お手を煩わせない範囲で、
参考になるプログラムを教えていただけると嬉しいです。

NSさん

お世話なっております。

NSさんの仰る流れで良いかと思います。
(以前のコメントで私が申し上げたpropertiesでループというのは忘れて頂ければと思います。)
「フィールドコードを配列に格納する->配列に格納したフィールドコードを1つずつ取り出し初期値を指定する」については、配列に格納しないで、そのまま初期値を代入をする方がシンプルかなと思いました。

細かく言うのであれば、下記のようになるかと思います。
1 全レコードフォームの設定を取得する
2.1 全レコードについてループさせる
2.2 2.1のループの中で各レコードのフィールドについてループさせる(Object.values()などを使うと良さそう)
2.3 2.2のループの中でvalueの空白チェックを行い、空白であればフォームの設定を用いて初期値を代入する
3 レコードの更新をする

申し訳ございませんが、今回の実装に近いような記事などは見つけられませんでした。
現状のコードや躓いている箇所を教えていただければ、なにかお力になれるかもしれません。

江田様

返信が遅くなり、申し訳ございません。

ご丁寧にいありがとうございます!
イメージは掴めました!

あとは具体的なコードを勉強しながら組み立ててみます。
改めて質問させていただくこともあるかと思いますが、
その際はよろしくお願いいたします。