ユーザマニュアル

【9/16開催】Pleasanter User Meet Up#11 プリザンター×MCPサーバ 「プリザンターをもっと活用するために」資料ダウンロード 「プリザンター入門」発売中!

2026/07/27

MANUAL

開発者向け機能:サーバスクリプト:notification.Send

## 概要 生成、設置情報を取得した通知のオブジェクトを用いて、任意のタイミングで通知を送信します。 ## 前提条件 [Notification.json](/ja/manual/notification-json)の対象の通知種別(Mail等)を true に設定することが必要です。 ## 構文 ``` notification.Send() ``` ## 戻り値 通知処理の成否にかかわらず true が返却されます。メールサーバへの送信に失敗した場合は Syslogs に記録されます。 ## 使用例 #### メール 以下の例では、下記宛先へタイトルが "通知テスト"、内容が "サーバスクリプトから通知しています" の通知を行います。 ・To: xxxxx@example.com ・Cc: yyyyy@example.com ・Bcc: zzzzz@example.com ##### JavaScript ``` let notification = notifications.New(); notification.Address = 'xxxxx@example.com'; notification.CcAddress = 'yyyyy@example.com'; notification.BccAddress = 'zzzzz@example.com'; notification.Title = '通知テスト'; notification.Body = 'サーバスクリプトから通知しています。'; notification.Send(); ``` #### Teams 以下の例ではTeamsへ通知を送信します。(Teamsへの通知には事前に設定が必要です。下例の"notification.Address"についてはマニュアル[Microsoft Teamsに通知できるように設定する](/ja/manual/teams)の"アドレス"欄の設定を参照ください。) ##### JavaScript ``` let notification = notifications.New(); notification.Type = 6; //通知先Teamsの指定 notification.Address = 'https://***/***'; //通知先Teamsのwebhook urlを指定 notification.Title = '通知テスト'; notification.Body = 'サーバスクリプトから通知しています。'; notification.Send(); ``` #### Slack 以下の例ではSlackへ通知を送信します。(Slackへの通知には事前に設定が必要です。下例の"notification.Address"についてはマニュアル[Slackに通知できるように設定する](/ja/manual/slack)の"アドレス"欄の設定を参照ください。) ##### JavaScript ``` let notification = notifications.New(); notification.Type = 2; //通知先Slackの指定 notification.Address = 'https://hooks.slack.com/***'; notification.Title = '通知テスト'; notification.Body = 'サーバスクリプトから通知しています。'; notification.Send(); ``` #### Chatwork 以下の例ではChatworkへ通知を送信します。(Chatworkへの通知には事前に設定が必要です。下例の"notification.Address"、"notification.Token"についてはマニュアル[Chatworkに通知できるように設定する](/ja/manual/chatwork)の"アドレス"欄、"トークン"欄の設定を参照ください。) ##### JavaScript ``` let notification = notifications.New(); notification.Type = 3 //通知先Chatworkの指定 notification.Token = '***'; notification.Address = 'https://api.chatwork.com/***'; notification.Title = '通知テスト'; notification.Body = 'サーバスクリプトから通知しています。'; notification.Send(); ``` ## サンプルコード <details> <summary>1. 状況・内容に応じて動的なメール通知を行う</summary> ##### 概要 購買申請の状態(ステータス)と申請内容に応じて、件名・本文を動的に組み立て、対象者へメール通知を送信するサンプルコードです。通知は任意で登録したプロセスから起動する想定です。 ##### 使用フィールド一覧 以下のような項目を使用します。 | フィールド | ctx プロパティ | 内容 | |---|---|---| | model.Title | title | 案件名 | | model.ClassA | applicant | 申請者(ユーザーIDから氏名に変換) | | model.ClassD | creatorMail | 申請者メールアドレス | | model.ClassB | - | 承認者 | | model.ClassE | approverAddr | 承認者メールアドレス | | model.ClassC | - | 購買担当 | | model.ClassF | purchaseMgr | 購買担当メールアドレス | | model.NumA | amount | 申請金額 | | model.DateA | deadline | 希望納期(yyyy/mm/dd 形式に変換) | | model.DateB | approved_at | 承認日時(yyyy/mm/dd 形式に変換) | | model.Status | status | ステータス(下表参照) | | model.CheckA | isUrgent | 至急フラグ | | model.CheckB | isReapply | 再申請フラグ | | model.DescriptionA | comment | コメント | ##### ステータス値の意味 | 値 | 意味 | |---|---| | 100 | 承認待ち | | 200 | 承認済み | | 300 | 差し戻し | | 900 | 納品確認待ち | ##### メール文面/宛先の編集条件 件名、ヘッダ、本文、フッタ、宛先を以下の条件で編集します。メール本文は、ヘッダ+本文+フッタの構成になります。 1. 件名 | 条件 | 件名 | |---|---| | 至急フラグ ON | 【至急】購買申請の承認依頼:{案件名} | | 申請金額 50万円以上 | 【高額案件】購買申請の承認依頼:{案件名} | | 上記以外 | 【承認依頼】購買申請:{案件名} | > 複数条件が成立する場合は、上から順に最初に一致したものを採用。 2. ヘッダ | 条件 | ヘッダ文面 | |---|---| | 至急フラグ ON | 緊急対応が必要な購買申請が提出されました。速やかにご確認のうえ、承認または差し戻しをお願いします。 | | 申請金額 50万円以上 | 高額な購買申請が提出されました。慎重にご確認のうえ、承認または差し戻しをお願いします。 | | 再申請フラグ ON | 前回差し戻しされた申請が修正・再提出されました。変更内容をご確認のうえ、ご対応をお願いします。 | | 上記以外 | 新しい購買申請が提出されました。内容をご確認のうえ、ご対応をお願いします。 | > 複数条件が成立する場合は、上から順に最初に一致したものを採用。 3. 本文 | 条件(ステータス) | 本文内容 | |---|---| | 100:承認待ち | 申請内容(案件名・申請者・申請金額・希望納期) | | 200:承認済み | 承認結果(案件名・申請金額・承認日時) | | 300:差し戻し | 差し戻し通知(案件名・申請金額・コメント参照を促す) | | 900:納品確認 | 納品確認依頼(案件名・申請金額・納品日) | > comment フィールドに値がある場合は、本文末尾に「■ コメント」セクションを追加。 4. フッタ | 送信対象 | フッタ文面 | |---|---| | 承認者 | 承認はシステムにログインして行ってください。期限までに対応がない場合は自動リマインドが送信されます。 | | 申請者 | 申請内容の確認・修正はシステムよりお願いします。不明な点は購買担当までお問い合わせください。 | | 購買担当 | 発注処理はシステムの購買管理画面から行ってください。対応期限にご注意ください。 | 5. 宛先 | 送信対象 | 送信条件 | |---|---| | 承認者(ClassE) | ステータスが 100(承認待ち)または 300(差し戻し)、かつアドレスが設定されている | | 申請者(ClassD) | ステータスが 200(承認済み)または 300(差し戻し)、かつアドレスが設定されている | | 購買担当(ClassF) | ステータスが 200(承認済み)または 900(納品確認)、かつアドレスが設定されている | > 条件を満たす宛先が複数ある場合は、それぞれに個別のメールが送信される(ステータス 200 では申請者・購買担当の両方に送信)。 ##### 送信メールイメージ ``` **件名** 【承認依頼】購買申請:モニター購入(開発部10台) **内容** 新しい購買申請が提出されました。 内容をご確認のうえ、ご対応をお願いします。 ■ 申請内容 案件名 :モニター購入(開発部10台) 申請者 :高橋 一郎 申請金額:480,000 円 希望納期:2026/04/15 承認はシステムにログインして行ってください。 期限までに対応がない場合は自動リマインドが送信されます。 ``` ##### JavaScript ```javascript // ---------------------------------------------------------------- // 【定義体】件名・ヘッダ・本文内容・フッタの文面 // ---------------------------------------------------------------- const SUBJECT_DEF = { urgent: (vars) => `【至急】購買申請の承認依頼:${vars.title}`, high_amount: (vars) => `【高額案件】購買申請の承認依頼:${vars.title}`, normal: (vars) => `【承認依頼】購買申請:${vars.title}`, }; const HEADER_DEF = { urgent: '緊急対応が必要な購買申請が提出されました。\n' + '速やかにご確認のうえ、承認または差し戻しをお願いします。\n', high_amount: '高額な購買申請が提出されました。\n' + '慎重にご確認のうえ、承認または差し戻しをお願いします。\n', reapply: '前回差し戻しされた申請が修正・再提出されました。\n' + '変更内容をご確認のうえ、ご対応をお願いします。\n', normal: '新しい購買申請が提出されました。\n' + '内容をご確認のうえ、ご対応をお願いします。\n', }; const BODY_DEF = { waiting: (vars) => '■ 申請内容\n' + ` 案件名 :${vars.title}\n` + ` 申請者 :${vars.applicant}\n` + ` 申請金額:${vars.amount} 円\n` + ` 希望納期:${vars.deadline}\n`, approved: (vars) => '■ 承認結果\n' + ' ステータス:承認済み\n' + ` 案件名  :${vars.title}\n` + ` 申請金額 :${vars.amount} 円\n` + ` 承認日時 :${vars.approved_at}\n`, rejected: (vars) => '■ 差し戻し通知\n' + ` 案件名 :${vars.title}\n` + ` 申請金額:${vars.amount} 円\n` + ' 差し戻し理由・修正依頼は下記コメントをご確認ください。\n', delivery: (vars) => '■ 納品確認依頼\n' + ` 案件名 :${vars.title}\n` + ` 申請金額:${vars.amount} 円\n` + ` 納品日 :${vars.deadline}\n` + ' ※ 納品確認後、速やかに検収処理をお願いします。\n', }; const FOOTER_DEF = { approver: '\n承認はシステムにログインして行ってください。\n' + '期限までに対応がない場合は自動リマインドが送信されます。\n', applicant: '\n申請内容の確認・修正はシステムよりお願いします。\n' + '不明な点は購買担当までお問い合わせください。\n', purchase_mgr: '\n発注処理はシステムの購買管理画面から行ってください。\n' + '対応期限にご注意ください。\n', }; // ---------------------------------------------------------------- // 【定義体】キー判定ルール(RULE_DEF) // ---------------------------------------------------------------- const RULE_DEF = { // 件名の判定ルール(3パターン) subject: { fallback: 'normal', rules: [ { key: 'urgent', when: (ctx) => ctx.isUrgent, }, { key: 'high_amount', when: (ctx) => ctx.amount >= 500000, }, ], }, // ヘッダの判定ルール(4パターン) header: { fallback: 'normal', rules: [ { key: 'urgent', when: (ctx) => ctx.isUrgent, }, { key: 'high_amount', when: (ctx) => ctx.amount >= 500000, }, { key: 'reapply', when: (ctx) => ctx.isReapply, }, ], }, // 本文内容の判定ルール(4パターン) body: { fallback: 'waiting', rules: [ { key: 'waiting', when: (ctx) => ctx.status === 100, }, { key: 'approved', when: (ctx) => ctx.status === 200, }, { key: 'rejected', when: (ctx) => ctx.status === 300, }, { key: 'delivery', when: (ctx) => ctx.status === 900, }, ], }, // 送信先ごとのフッタ・送信条件の定義(3パターン) recipients: [ { footerKey: 'approver', address: (ctx) => ctx.approverAddr, sendWhen: (ctx) => (ctx.status === 100 || ctx.status === 300) && !!ctx.approverAddr, }, { footerKey: 'applicant', address: (ctx) => ctx.creatorMail, sendWhen: (ctx) => (ctx.status === 200 || ctx.status === 300) && !!ctx.creatorMail, }, { footerKey: 'purchase_mgr', address: (ctx) => ctx.purchaseMgr, sendWhen: (ctx) => (ctx.status === 200 || ctx.status === 900) && !!ctx.purchaseMgr, }, ], }; // ユーティリティ function toYmd(d) { const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); return `${y}/${m}/${day}`; } function getUserName(userId) { const user = users.Get(userId); return user.Name; } // ================================================================ // 汎用エンジン:ルール定義を走査してキーを決定する // ================================================================ function resolveKey(ruleDef, ctx) { for (const rule of ruleDef.rules) { if (rule.when(ctx)) { return rule.key; } } return ruleDef.fallback; } // ================================================================ // メイン処理 // ================================================================ function sendMailMain() { // --- コンテキスト(レコード値)をまとめる --- const ctx = { title: model.Title, applicant: getUserName(model.ClassA), approverAddr: model.ClassE, purchaseMgr: model.ClassF, amount: model.NumA, deadline: toYmd(model.DateA), approved_at: toYmd(model.DateB), status: model.Status, isUrgent: model.CheckA, isReapply: model.CheckB, comment: model.DescriptionA, creatorMail: model.ClassD, }; // --- プレースホルダ用の値マップ --- const vars = { title: ctx.title, applicant: ctx.applicant, amount: Number(ctx.amount).toLocaleString('ja-JP'), deadline: ctx.deadline, approved_at: ctx.approved_at, }; // --- ルールエンジンでキーを決定 --- const subjectKey = resolveKey(RULE_DEF.subject, ctx); const headerKey = resolveKey(RULE_DEF.header, ctx); const bodyKey = resolveKey(RULE_DEF.body, ctx); // --- 件名を生成 --- const subject = SUBJECT_DEF[subjectKey](vars); logs.LogInfo(`生成した件名: ${subject}`, 'MainProcess'); // --- 本文を組み立てる関数(フッタキーを引数で切り替え)--- function buildBody(footerKey) { let body = HEADER_DEF[headerKey] + '\n' + BODY_DEF[bodyKey](vars); if (ctx.comment && ctx.comment.trim() !== '') { body += '\n■ コメント\n ' + ctx.comment + '\n'; } body += FOOTER_DEF[footerKey]; return body; } // --- 送信先ルールをループして通知送信 --- for (const r of RULE_DEF.recipients) { if (!r.sendWhen(ctx)) continue; const n = notifications.New(); n.Address = r.address(ctx); n.Title = subject; n.Body = buildBody(r.footerKey); n.Send(); } } switch (context.ControlId) { // ControlIdで実行されたプロセスを判断 case 'Process_1': // プロセスID:1の処理 sendMailMain(); break; default: // 何もしない break; } ``` </details> ## 注意事項 こちらは[サーバスクリプト](/ja/manual/table-management-server-script)で使用するメソッドです。[スクリプト](/ja/manual/table-management-script)では使用できません。 ## 対応バージョン |対応バージョン|内容| |:--|:--| |1.4.10.0 以降|notificationオブジェクトにプロパティCcAddress、BccAddressを追加| ## 関連情報 ・[テーブルの管理:サーバスクリプト](/manual/table-management-server-script) ・[オブジェクトごとの実行タイミング](/manual/server-script-conditions) ・[notificationsオブジェクト](/manual/server-script-notifications) ・[notificationオブジェクト](/manual/server-script-notification) ・[notifications.Newメソッド](/manual/server-script-notifications-new) ・[notifications.Getメソッド](/manual/server-script-notifications-get)
code VS Codeで開発作業をもっとスマートに

スクリプト開発の効率を高めたい方に、Code Assistをご用意しています。

Code Assistの詳細はこちら →
account_tree 複雑な構成も、すっきり視覚化

サイト構成やデータのつながりを可視化し、把握しやすくします。

Site Visualizerの詳細はこちら →
TOP