ブログ

2023/01/04
【プリザンター】 第176回)レコード作成時に複製レコードを作成する方法

レコードを新規作成時に同じようなレコードを作成したいという要望

新年あけましておめでとうございます、CCS田中です。

2023年の幕が明けました。昨年はサッカーワールドカップで大いに沸いた年末でしたね。
当社もワールドカップの勢いに負けず、今年もブログを継続していきたいと思いますので、引き続きご愛顧よろしくお願いします。

さて先日、当社のお客様からの質問で「レコードを新規作成したときに、登録された情報を一部コピーしたレコードを作成できないか」というものがありました。
1つの問合せに対して、関係部署が対処するような業務で、個別にステータス管理をされたいのだと思います。そういった場合に、複製ボタンを作成して「一度レコードを作成した後に複製ボタンをクリック」ということでもよいのかもしれませんが、この件数が多い場合は手間ですので、一回の操作で行いたいという希望も理解できます。

ということで、この機能をサーバスクリプトを使って書いていきましょう。

レコードの複製スクリプト

サーバスクリプトでは、items.Newitems.Create というメソッドが用意されています。
これらを使っていきます。
単純なもので「タイトルのみをコピーしてレコード複製するサーバスクリプト」を記載すると以下のようになります。
ただし、このサーバスクリプトを実行すると、作成したレコードと同じタイトルのレコードが10個出来てしまいます。
これは、内部で処理が再帰的に繰り返されているためです。10個まで作成されるのは、プリザンター上で再起処理を上限10で止めているための様です。

<うまく動かないスクリプト>


let item = items.New();
item.Title = model.Title;
items.Create(xxxxx, item); //xxxxxはレコードを追加するサイトのSiteId


ということで、上記のスクリプトでは問題があるため、少し条件を追加してレコードを複製するようにしましょう。
ある変数(フラグ)を用意しておき、それが定義されていない状態のときのみに複製する処理とします。
変数は下記では 「Triggered」です。
複製後に、この変数に値を入れることで1回のみの処理となり期待通り複製することができます。
try-catchも入れて運用等にも使えるような形にしましょう。
これを実装して、レコードを作成してみてください。タイトルが複製されて、それ以外は初期状態となるレコードが作成されると思います。
必要に応じて、複製する項目はスクリプトに追加することで対応できるでしょう。

<正しいスクリプト>

try {
if (context.UserData.Triggered === undefined) {
let api_model = items.New();
api_model.Title = model.Title;
context.UserData.Triggered = true;
items.Create(context.SiteId, api_model);
}
} catch (e) {
context.Log(e);
}

まとめ

いかがでしたか?

今回はサーバスクリプトの1メソッドを紹介しました。スクリプトの最初の例は実際に私が作成してうまくいかなかった例です。
同様のこともあると思いますので、そんなときは年間サポートは強い味方になると思います。
ぜひご検討ください。

弊社ではスタイル・スクリプトサンプル集、プリザンター逆引き辞典のほかにも、運用ノウハウ集の販売もございます。また、導入の支援や、スクリプト開発なども支援いたします。

ご相談の内容によっては有料となる場合がございますが、まずは気軽にご相談ください。
☆☆☆
ブログ内容への質問や追加説明をご希望の方は【 問い合わせフォーム 】からお気軽にお問い合わせください
☆☆☆

PAGE TOP