コンテンツにスキップ

コードの共有

概要

サーバスクリプトのコードを共有化する機能です。サーバスクリプトの条件にある共有のチェックをオンにすることで、その他のサーバスクリプトの先頭にコードが読み込まれます。

制限事項

  1. 実行時は、各サーバスクリプトのTryCatch、関数化の設定に従って実行コードが生成され、共有コードがその先頭へ差し込まれます。
  2. 「共有」のチェックをオンにしたサーバスクリプトに、TryCatch、関数化、//debug//(サーバスクリプトのデバッグを参照)の設定は適用されません。
  3. 「共有」のチェックをオンにしたサーバスクリプトで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(作成後)
logger.debug('作成処理を開始: ' + model.Title, 'onCreate');
logger.info('作成: ' + model.Title, 'onCreate');

3本目(タイトル:onUpdate、条件:「更新後」)に貼り付けるコードです。上記「作成後」とは別のスクリプトとして、この内容で新規に登録してください。

JavaScript(更新後)
logger.debug('更新処理を開始: ' + model.Title, 'onUpdate');
logger.info('更新: ' + model.Title, 'onUpdate');

4本目(タイトル:onDelete、条件:「削除後」)に貼り付けるコードです。上記2つとは別のスクリプトとして、この内容で新規に登録してください。

JavaScript(削除後)
logger.debug('削除処理を開始: ' + context.Id, 'onDelete');
logger.info('削除: ' + context.Id, 'onDelete');

対応バージョン

対応バージョン 内容
1.1.37.0 以降 機能追加

関連情報