はじめに
プリザンターのサーバスクリプト、modelで取得出来る添付ファイルの項目はJSON文字列がそのままセットされているため若干扱いが面倒・・・。毎回JSON.parse
で変換するのは地味に手間がかかるので、拡張サーバスクリプトを使用して、一括で変換するテクニックを紹介します。
実装の中身
まずは、格納されているデータを見てみます。
[{"Guid":"47BFA611B94B4703865019110F4B3DFD","Name":"ED-038-datasheet.pdf","Size":1520972,"Deleted":true,"HashCode":"23pz2IFY4jenPCGgU7L2ci8Z/Uth2eReoBer8Sm+wVQ="}]
普通のJSONです。これなら素直にパースできますね。model
のプロパティやそのものを直接触ると面倒なので、Attachmentsなプロパティだけをmodel_attachments
という変数を作ってそちらにセットしてみます。
サーバスクリプトの条件は「画面表示の前」や「行表示の前」にセットすればOKです。他の場所でもmodel
にアクセス出来る条件ならどこでも使えます。
const regex = new RegExp('^Attachments');
let model_attachments = {};
for (const [key, value] of Object.entries(model)) {
if (regex.test(key)) {
model_attachments[key] = JSON.parse(value || '[]');
}
}
AttachmentsA~Z
とAttachments001~999
のうちページに表されているもの(=model
に含まれているもの)だけが、model_attachments
にセットされます。表示されていないものを触りたいときはview.AlwaysGetColumns
を使って対象を追加する方法も吊しのまま使えるようになっています。
拡張サーバスクリプトにしてみた
それぞれのサイトに追加していくもの面倒なので、拡張サーバスクリプトにして組み込んでみました。
条件は、「画面表示の前」と「秒表示の前」にしていますが、必要に応じて追加・変更してみてください。
{
"Name": "modelの添付ファイルのJSONをオブジェクトに変換する",
"BeforeOpeningPage": true,
"BeforeOpeningRow": true,
"Body": "// Write an arbitrary script."
}
let model_attachments = {};
let success_parse = false;
//エラーが出ると面倒なのでtry-catchで囲っておく
try {
const regex = new RegExp('^Attachments');
for (const [key, value] of Object.entries(model)) {
if (regex.test(key)) {
model_attachments[key] = JSON.parse(value || '[]');
}
}
success_parse = true;
} catch(e) {
success_parse = false;
context.Error(e.Stack);
}
拡張サーバスクリプトはエラーを吐くと全部が止まってしまって面倒なので、try-catchで囲っています。また、正常に実行されることを確認するために、success_parse
に実行に成功したかどうかをtrue/false
でセットしています。
まとめ
サーバスクリプトでの添付ファイルの扱いをちょっとしたサーバスクリプトで簡単にしてみました。この方法、実は別の項目でも応用が利くのですが、それはまた別の機会に紹介します。