ブログ

2024/07/03
【プリザンター】 第254回)スクリプト/サーバースクリプトにてサイト名からサイトIDが取得できるようになりました①

サイトパッケージのインポートに伴うスクリプトのお悩みを解決!

こんにちは、シーイーシーカスタマサービスの森山です。

年間サポートをご契約のお客様より、次のようなお問合せをいただきました。

『検証環境でスクリプトを作成して本番環境へ移行した際、スクリプトに記述している検証環境のサイトIDと、本番環境のサイトIDが異なるため正常に動かなくなってしまいます。
対応方法としては、移行後にスクリプト内のサイトIDを本番環境のサイトIDに書き換えるしかないのでしょうか?』


プリザンターには サイトパッケージのインポート・エクスポート機能 があります。この機能を使うと、サイトパッケージインポート前とインポート後にてサイトIDが変わってしまいますが、リンク先の情報などは自動的に変換された状態でサイトを複製することができます。
しかし、インポート後のサイト(複製サイト)のスクリプト内に記述されているサイトIDについては、お問合せにある通り自動的に変換されません。

そんなお悩みを解決する関数が、バージョン1.4.5.0 にて追加されました。この追加された関数を使うと、サイト名からサイトIDを取得することができます!
そこで今回は、追加された関数の「スクリプト」での使い方についてご説明します。

スクリプトの関数「$p.apiGetClosestSiteId」

今回は例として、入力テーブルにレコードを登録した際、指定のテーブルにレコードを作成、または更新するという動きをご説明します。

まずはテーブルを2つ準備します。
テーブルA(入力テーブル)には、分類Aと日付Aを設定します。
テーブルB(データ複製テーブル)にも、テーブルAと同じように分類Aと日付Aを設定します。



■ ここに注意!
テーブルB(データ複製テーブル)には、必ず「サイト名」を設定してください。今回ご説明する関数は、この「サイト名」を使用します。(例では「集計用サイト」と設定)
サイトの「タイトル」ではありませんのでご注意ください。


テーブルの準備が整いましたら、テーブルA(入力テーブル)の スクリプト タブに下記のコードを記述します。
出力先は「新規作成」「編集」を指定してください。

$p.events.before_send = function (args) {
$p.apiGetClosestSiteId({
id: $p.siteId(),
data: {
FindSiteNames: ["集計用サイト"]
},
done: function (data) {
$p.apiUpsert({
id: data.Data[0].SiteId,
data: {
ApiVersion: 1.1,
Keys: ["ClassA", "DateA"],
ClassHash: {
ClassA: $p.getControl("ClassA").val(),
},
DateHash: {
DateA: $p.getControl("DateA").val(),
},
},
});
},
});
};


説明
3行目:idにて、本スクリプトを設定しているサイトのIDを指定します。このIDを基準にして、5行目で指定するサイト名を最も近いサイトから検索します。
5行目:FindSiteNamesにて、指定するサイト名を配列で記述します。サイト名を複数指定する場合は ['サイト01','サイト02'] と記述します。
9行目:5行目で指定したサイト名のサイトIDを指定します。
12行目:設定したキー項目をもとに、指定サイトでレコード作成・更新(upsert)を行います。

■ ここがポイント!
指定するサイト名は以下の順序で検索され、IDの返却が行われます。
  • 1.自サイトが指定するサイト名の場合は、自サイトのIDを返す
  • 2.自サイトと同じ階層のサイト一覧から指定するサイト名が見つかった場合は、そのサイトのIDを返す
  • 3.自サイトと同じ階層でフォルダがある場合はそのフォルダ内を深さ優先で検索を行い、
     指定するサイト名が見つかった場合がそのサイトのIDを返す
  • 4.「3」で自サイト以下に該当サイトが無い場合は自サイトより一階層上に遷移し、
     一階層上のサイト一覧から指定するサイト名が見つかった場合はそのサイトのIDを返す
  • 5.以降、同様に「2」~「4」の処理を自サイトを現在サイトと読み替えて繰り返し検索処理を続け、
     指定するサイト名が見つかった場合はそのサイトのIDを返す
  • 6.全てのサイトを探索して指定するサイト名が見つからない場合は、-1を返す

■ ここに注意!
プリザンターでは複数のサイトで同一の名称を設定することができます。
しかし、本関数では同一のサイト名が複数存在する場合、意図しないサイトが指定される可能性があります。本関数を使用する場合は、サイト名を重複しないように運用してください。

実際にテーブルA(入力テーブル)にレコードを登録すると、テーブルB(データ複製テーブル)にも同じ内容のレコードが登録されます。
テーブルA(入力テーブル)にて登録したレコードを更新すると、テーブルB(データ複製テーブル)のレコードも更新されます。


では、作成したサイトをフォルダごとエクスポートし、インポートしてみましょう。


分かりやすくするために、インポートしたサイトのフォルダ名を変更しています。


これまでですと、サイトパッケージのインポートを行った後にスクリプト内のサイトIDの記述を修正しないとエラーが発生したり、今回の場合ですと意図したサイトとは異なるサイトのデータが更新されていました。
インポート後、スクリプトの修正を行わない状態でテーブルA(入力テーブル)にて新規レコードを作成すると……


同じくインポートされたテーブルB(データ複製テーブル)にレコードが作成されました!!

■ ここに注意!
指定するサイト名を変更した場合には、サイトIDでの記述と同様に、スクリプト内のサイト名の記述の変更を必ず行ってください。

まとめ

いかがでしたか?

テンプレートとなるサイトパッケージを用意して、それらを案件に応じてインポートして使用するといった運用をされている方も多くいらっしゃると思います。
サイトパッケージのインポートの度にスクリプト内のサイトIDを変更する必要がありましたが、この関数を使用することでその対応が不要となり、テンプレートの共有がよりしやすくなります!

次回は「サーバスクリプト」でのサイト名からサイトIDを取得する関数の使い方についてご説明します。

弊社ではプリザンターをご使用中、または、これからご使用になられる方向けに、運用ノウハウ集、プリザンター逆引き辞典、スタイル・スクリプトサンプル集の販売を行っております。
また、 プリザンターからのExcel帳票出力・PDF帳票出力の支援パック販売 も行っております。
プリザンター導入の支援や、スクリプト開発などの支援も行っておりますので、まずは気軽にご相談ください。
※ご相談の内容によっては有料となる場合がございます。予めご了承ください。
☆☆☆
ブログ内容への質問や追加説明をご希望の方は【 問い合わせフォーム 】からお気軽にお問い合わせください
☆☆☆

PAGE TOP