コードの共有
概要¶
サーバスクリプトのコードを共有化する機能です。サーバスクリプトの条件にある共有のチェックをオンにすることで、その他のサーバスクリプトの先頭にコードが読み込まれます。
制限事項¶
- 実行時は、各サーバスクリプトのTryCatch、関数化の設定に従って実行コードが生成され、共有コードがその先頭へ差し込まれます。
- 「共有」のチェックをオンにしたサーバスクリプトに、TryCatch、関数化、//debug//(サーバスクリプトのデバッグを参照)の設定は適用されません。
- 「共有」のチェックをオンにしたサーバスクリプトでTryCatchや関数化を設定したい場合は、コードに直接try-catch句や無名関数化の記述をしてください。ただしブロックスコープとなるため呼び出す側のサーバスクリプトで参照できなくなる恐れがありますので、十分に検証を行ってください。
サンプルコード¶
1. 作成後・更新後・削除後のログ出力を、共有スクリプトにまとめる
「作成後」「更新後」「削除後」の3つのタイミングで動くサーバスクリプトから、共通のログ出力処理を1つの「共有」スクリプトにまとめます。各トリガー側のスクリプトはログの実装を持たず、logger.info(...)のように呼び出すのみです。
実務での使いどころ¶
1つのテーブルに対して、作成時・更新時・削除時のそれぞれにサーバスクリプトを設定し、同じ書式でログを出力する、という構成は珍しくありません。共有機能を使わずに同じロジックを3つのスクリプトへ個別にコピーして運用すると、デバッグモードの切り替えや出力先の変更、書式の修正が必要になるたびに3か所を直すことになり、1か所直し忘れると「作成のログだけ書式が違う」といった不整合が起こります。
共有スクリプトへロジックをまとめておけば、デバッグモードの切り替えなど共通の設定変更を1箇所で済ませられ、各トリガー側は自分固有の処理のみを書けば済みます。
共有はサイト(テーブル)内の全スクリプトへ一律に読み込まれるため、共有スクリプトに置く内容は選ぶ必要があります。どのトリガーからも使う共通処理(ロガーやユーティリティ関数など)のみを置き、特定のトリガーでしか使わない業務ロジックは置かないようにしてください。
事前準備¶
1:サーバスクリプトを4つ登録します。
1-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択します。
1-2:1本目(共有本体)を以下の設定で登録します。
| 設定項目 | 設定値 |
|---|---|
| タイトル | 任意の名前(例:sharedLogger) |
| スクリプト | 下記サンプルコード「共有スクリプト」を貼り付け |
| 条件 | 「共有」にチェック |
1-3:2本目〜4本目(各トリガー)を、それぞれ以下の設定で登録します。
| タイトル(例) | スクリプト | 条件 |
|---|---|---|
| onCreate | 下記サンプルコード「作成後」を貼り付け | 「作成後」にチェック |
| onUpdate | 下記サンプルコード「更新後」を貼り付け | 「更新後」にチェック |
| onDelete | 下記サンプルコード「削除後」を貼り付け | 「削除後」にチェック |
1本目(タイトル:sharedLogger、条件:「共有」)に貼り付けるコードです。
JavaScript(共有スクリプト)¶
// ============================================================
// デバッグモード。true にすると debug() ログが出力される
// ============================================================
const DEBUG_MODE = false;
/**
* 出力先の制御
* console : ブラウザ開発者ツールのコンソールに出力するか
* syslogs : システムログ(SysLogs テーブル)に出力するか
*/
const LOG_TARGET = {
console: true,
syslogs: true,
};
// ============================================================
// ロガー本体
// ============================================================
const logger = (function (debugMode, target) {
/**
* 内部共通出力関数
* @param {Function} logFn - logs オブジェクトのメソッド
* @param {string} message - ログメッセージ
* @param {string} method - メソッド名(省略可)
* @param {boolean} forceOutput - デバッグモードに関係なく常に出力するか
*/
function _write(logFn, message, method, forceOutput) {
if (!forceOutput && !debugMode) return;
const m = method || '';
logFn(message, m, target.console, target.syslogs);
}
return {
/**
* デバッグログ(DEBUG_MODE=true のときのみ Info として出力)
* @param {string} message
* @param {string} [method]
*/
debug: function (message, method) {
_write(
function (msg, mth, con, sys) {
logs.LogInfo(msg, mth, con, sys);
},
'[DEBUG] ' + message,
method,
false, // デバッグモード時のみ出力
);
},
/**
* 情報ログ(常に Info として出力)
* @param {string} message
* @param {string} [method]
*/
info: function (message, method) {
_write(
function (msg, mth, con, sys) {
logs.LogInfo(msg, mth, con, sys);
},
message,
method,
true, // 常に出力
);
},
/**
* 警告ログ(常に Warning として出力)
* @param {string} message
* @param {string} [method]
*/
warn: function (message, method) {
_write(
function (msg, mth, con, sys) {
logs.LogWarning(msg, mth, con, sys);
},
message,
method,
true,
);
},
/**
* ユーザエラーログ(常に UserError として出力)
* @param {string} message
* @param {string} [method]
*/
userError: function (message, method) {
_write(
function (msg, mth, con, sys) {
logs.LogUserError(msg, mth, con, sys);
},
message,
method,
true,
);
},
/**
* システムエラーログ(常に SystemError として出力)
* @param {string} message
* @param {string} [method]
*/
systemError: function (message, method) {
_write(
function (msg, mth, con, sys) {
logs.LogSystemError(msg, mth, con, sys);
},
message,
method,
true,
);
},
/**
* 例外ログ(常に Exception として出力)
* catch ブロック内で利用する想定。
* @param {Error|string} error - Error オブジェクト、またはメッセージ文字列
* @param {string} [method]
*/
exception: function (error, method) {
var message;
if (error && typeof error === 'object' && error.stack) {
message = error.message + '\n' + error.stack;
} else {
message = String(error);
}
_write(
function (msg, mth, con, sys) {
logs.LogException(msg, mth, con, sys);
},
message,
method,
true,
);
},
};
})(DEBUG_MODE, LOG_TARGET);
2本目(タイトル:onCreate、条件:「作成後」)に貼り付けるコードです。共有スクリプトとは別に、この内容で新規に登録してください。
JavaScript(作成後)¶
3本目(タイトル:onUpdate、条件:「更新後」)に貼り付けるコードです。上記「作成後」とは別のスクリプトとして、この内容で新規に登録してください。
JavaScript(更新後)¶
4本目(タイトル:onDelete、条件:「削除後」)に貼り付けるコードです。上記2つとは別のスクリプトとして、この内容で新規に登録してください。
JavaScript(削除後)¶
対応バージョン¶
| 対応バージョン | 内容 |
|---|---|
| 1.1.37.0 以降 | 機能追加 |
