notification.Send
Overview¶
Send notifications at any time using objects that get creation and setup information.
Prerequisites¶
The target notification type (e.g., Mail) in "Notification.json" must be set to true.
Syntax¶
Return Value¶
If the notification was sent, it returns true; if not, it returns false.
Usage Examples¶
Email¶
In the following example, a notification will be sent to xxxxx@example.com with the subject "Notification Test" and the content "Notified by server script".
JavaScript¶
let notification = notifications.New();
notification.Address = 'xxxxx@example.com';
notification.Title = 'Notification Test';
notification.Body = 'Notified by server script.';
notification.Send();
Teams¶
The following example sends a notification to Teams. (Pre-settings are required to send notifications to Teams. For the "notification.Address" in the example below, please refer to the settings in the "Address" field in the manual "Set up to send notifications to Microsoft Teams".)
JavaScript¶
let notification = notifications.New();
notification.Type = 6; //Specify the Teams to notify
notification.Address = 'https://***/***'; //Specify the webhook URL for the Teams to notify
notification.Title = 'Notification Test';
notification.Body = 'Notified by server script.';
notification.Send();
Slack¶
The following example sends a notification to Slack. (Pre-settings are required to send notifications to Slack. For the "notification.Address" in the example below, please refer to the settings in the "Address" field in the manual "Set up to send notifications to Slack".)
JavaScript¶
let notification = notifications.New();
notification.Type = 2; //Specify Slack as the notification destination
notification.Address = 'https://hooks.slack.com/***';
notification.Title = 'Notification Test';
notification.Body = 'Notification from server script.';
notification.Send();
Chatwork¶
The following example sends a notification to Chatwork. (Pre-settings are required to send notifications to Chatwork. For "notification.Address" and "notification.Token" in the example below, please refer to the settings in the "Address" and Token" fields in the manual "Set up to send notifications to Chatwork".)
JavaScript¶
let notification = notifications.New();
notification.Type = 3 //Specify Chatwork as the notification destination
notification.Token = '***';
notification.Address = 'https://api.chatwork.com/***';
notification.Title = 'Notification Test';
notification.Body = 'Notification from server script.';
notification.Send();
Code Samples¶
1. Send dynamic email notifications according to the status and content
Overview¶
This is a sample code that dynamically builds the subject and body according to the state (status) and content of a purchase request, and sends email notifications to the target people. The notification is assumed to be triggered from a process registered as desired.
Fields used¶
The following fields are used.
| Field | ctx property | Content |
|---|---|---|
| model.Title | title | Project name |
| model.ClassA | applicant | Applicant (converted from the user ID to the name) |
| model.ClassD | creatorMail | Applicant's email address |
| model.ClassB | - | Approver |
| model.ClassE | approverAddr | Approver's email address |
| model.ClassC | - | Purchasing staff |
| model.ClassF | purchaseMgr | Purchasing staff's email address |
| model.NumA | amount | Requested amount |
| model.DateA | deadline | Desired delivery date (converted to yyyy/mm/dd format) |
| model.DateB | approved_at | Approval date and time (converted to yyyy/mm/dd format) |
| model.Status | status | Status (see the table below) |
| model.CheckA | isUrgent | Urgent flag |
| model.CheckB | isReapply | Reapplication flag |
| model.DescriptionA | comment | Comment |
Meaning of the status values¶
| Value | Meaning |
|---|---|
| 100 | Waiting for approval |
| 200 | Approved |
| 300 | Sent back |
| 900 | Waiting for delivery confirmation |
Conditions for editing the email text and recipients¶
The subject, header, body, footer, and recipients are edited under the following conditions. The email body consists of header + body + footer.
- Subject
| Condition | Subject |
|---|---|
| Urgent flag ON | [Urgent] Request for approval of purchase request: |
| Requested amount 500,000 yen or more | [High-value] Request for approval of purchase request: |
| Otherwise | [Approval request] Purchase request: |
If more than one condition is met, the first match from the top is used.
- Header
| Condition | Header text |
|---|---|
| Urgent flag ON | A purchase request that requires urgent action has been submitted. Please check it promptly and approve or send it back. |
| Requested amount 500,000 yen or more | A high-value purchase request has been submitted. Please check it carefully and approve or send it back. |
| Reapplication flag ON | A request that was previously sent back has been corrected and resubmitted. Please check the changes and take action. |
| Otherwise | A new purchase request has been submitted. Please check the content and take action. |
If more than one condition is met, the first match from the top is used.
- Body
| Condition (status) | Body content |
|---|---|
| 100: Waiting for approval | Request details (project name, applicant, requested amount, desired delivery date) |
| 200: Approved | Approval result (project name, requested amount, approval date and time) |
| 300: Sent back | Send-back notice (project name, requested amount, prompt to see the comment) |
| 900: Delivery confirmation | Request for delivery confirmation (project name, requested amount, delivery date) |
If the comment field has a value, a "■ Comment" section is added at the end of the body.
- Footer
| Send to | Footer text |
|---|---|
| Approver | Please log in to the system to approve. If no action is taken by the deadline, an automatic reminder will be sent. |
| Applicant | Please check or correct the request in the system. If you have any questions, please contact the purchasing staff. |
| Purchasing staff | Please place the order from the purchase management screen of the system. Please be careful of the deadline. |
- Recipients
| Send to | Sending condition |
|---|---|
| Approver (ClassE) | The status is 100 (Waiting for approval) or 300 (Sent back), and the address is set |
| Applicant (ClassD) | The status is 200 (Approved) or 300 (Sent back), and the address is set |
| Purchasing staff (ClassF) | The status is 200 (Approved) or 900 (Delivery confirmation), and the address is set |
If more than one recipient meets the conditions, a separate email is sent to each of them (with status 200, it is sent to both the applicant and the purchasing staff).
Image of the email sent¶
**Subject**
[Approval request] Purchase request: Purchase of monitors (10 units for the Development Dept.)
**Content**
A new purchase request has been submitted.
Please check the content and take action.
■ Request details
Project name : Purchase of monitors (10 units for the Development Dept.)
Applicant : Ichiro Takahashi
Requested amount: 480,000 yen
Desired delivery: 2026/04/15
Please log in to the system to approve.
If no action is taken by the deadline, an automatic reminder will be sent.
JavaScript¶
// ----------------------------------------------------------------
// [Definitions] Text of the subject, header, body content, and footer
// ----------------------------------------------------------------
const SUBJECT_DEF = {
urgent: (vars) => `[Urgent] Request for approval of purchase request: ${vars.title}`,
high_amount: (vars) => `[High-value] Request for approval of purchase request: ${vars.title}`,
normal: (vars) => `[Approval request] Purchase request: ${vars.title}`,
};
const HEADER_DEF = {
urgent:
'A purchase request that requires urgent action has been submitted.\n' +
'Please check it promptly and approve or send it back.\n',
high_amount:
'A high-value purchase request has been submitted.\n' +
'Please check it carefully and approve or send it back.\n',
reapply:
'A request that was previously sent back has been corrected and resubmitted.\n' +
'Please check the changes and take action.\n',
normal:
'A new purchase request has been submitted.\n' +
'Please check the content and take action.\n',
};
const BODY_DEF = {
waiting: (vars) =>
'■ Request details\n' +
` Project name : ${vars.title}\n` +
` Applicant : ${vars.applicant}\n` +
` Requested amount: ${vars.amount} yen\n` +
` Desired delivery: ${vars.deadline}\n`,
approved: (vars) =>
'■ Approval result\n' +
' Status : Approved\n' +
` Project name : ${vars.title}\n` +
` Requested amount: ${vars.amount} yen\n` +
` Approved at : ${vars.approved_at}\n`,
rejected: (vars) =>
'■ Send-back notice\n' +
` Project name : ${vars.title}\n` +
` Requested amount: ${vars.amount} yen\n` +
' For the reason for sending back and the correction request, please see the comment below.\n',
delivery: (vars) =>
'■ Request for delivery confirmation\n' +
` Project name : ${vars.title}\n` +
` Requested amount: ${vars.amount} yen\n` +
` Delivery date : ${vars.deadline}\n` +
' * After confirming the delivery, please complete the acceptance inspection promptly.\n',
};
const FOOTER_DEF = {
approver:
'\nPlease log in to the system to approve.\n' +
'If no action is taken by the deadline, an automatic reminder will be sent.\n',
applicant:
'\nPlease check or correct the request in the system.\n' +
'If you have any questions, please contact the purchasing staff.\n',
purchase_mgr:
'\nPlease place the order from the purchase management screen of the system.\n' +
'Please be careful of the deadline.\n',
};
// ----------------------------------------------------------------
// [Definitions] Key decision rules (RULE_DEF)
// ----------------------------------------------------------------
const RULE_DEF = {
// Decision rules for the subject (3 patterns)
subject: {
fallback: 'normal',
rules: [
{
key: 'urgent',
when: (ctx) => ctx.isUrgent,
},
{
key: 'high_amount',
when: (ctx) => ctx.amount >= 500000,
},
],
},
// Decision rules for the header (4 patterns)
header: {
fallback: 'normal',
rules: [
{
key: 'urgent',
when: (ctx) => ctx.isUrgent,
},
{
key: 'high_amount',
when: (ctx) => ctx.amount >= 500000,
},
{
key: 'reapply',
when: (ctx) => ctx.isReapply,
},
],
},
// Decision rules for the body content (4 patterns)
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,
},
],
},
// Footer and sending condition for each recipient (3 patterns)
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,
},
],
};
// Utilities
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;
}
// ================================================================
// General-purpose engine: scans the rule definitions to decide the key
// ================================================================
function resolveKey(ruleDef, ctx) {
for (const rule of ruleDef.rules) {
if (rule.when(ctx)) {
return rule.key;
}
}
return ruleDef.fallback;
}
// ================================================================
// Main process
// ================================================================
function sendMailMain() {
// --- Collect the context (record values) ---
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,
};
// --- Value map for placeholders ---
const vars = {
title: ctx.title,
applicant: ctx.applicant,
amount: Number(ctx.amount).toLocaleString('ja-JP'),
deadline: ctx.deadline,
approved_at: ctx.approved_at,
};
// --- Decide the keys with the rule engine ---
const subjectKey = resolveKey(RULE_DEF.subject, ctx);
const headerKey = resolveKey(RULE_DEF.header, ctx);
const bodyKey = resolveKey(RULE_DEF.body, ctx);
// --- Generate the subject ---
const subject = SUBJECT_DEF[subjectKey](vars);
logs.LogInfo(`Generated subject: ${subject}`, 'MainProcess');
// --- Function that builds the body (switches the footer key by argument) ---
function buildBody(footerKey) {
let body = HEADER_DEF[headerKey] + '\n' + BODY_DEF[bodyKey](vars);
if (ctx.comment && ctx.comment.trim() !== '') {
body += '\n■ Comment\n ' + ctx.comment + '\n';
}
body += FOOTER_DEF[footerKey];
return body;
}
// --- Loop through the recipient rules and send notifications ---
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) {
// Determine the executed process by ControlId
case 'Process_1':
// Process for process ID 1
sendMailMain();
break;
default:
// Do nothing
break;
}
Cautions¶
This is a method used in "Server Script". It cannot be used in "Script".
Supported Versions¶
| Supported versions | Body |
|---|---|
| 1.4.10.0 and later | Added the CcAddress and BccAddress properties to the notification object |