概要
ServiceNowではIntegrationHub にSlack Spoke, Microsoft Teams Spoke その他メッセージ送信するアクションがありますが、
別のサブスクリプションが必要なので、RESTメッセージを使用して実装できないか調べてみました。
プラットフォーム
Paris
サンプルケース
変更要求のステータスが実装になるとTeamsに通知するというケースを想定
変更要求の更新をトリガーでビジネスルールでTeamsのWebhookにメッセージを送信します。
手順
Webhookの設定
Webhookの設定は他の記事を参考にして
Microsoft Teams API (Incoming Webhook) で投稿
エンドポイントをコピーしておく
RESTメッセージの設定
System Web Services > Outbound > REST Message から[New] ボタンを押してREST Messageを登録
コピーしたエンドポイントをここにペースト
登録後RESTメッセージ関数(HTTP Methods)を作成
今回はDefault GETを編集しました。
HTTPメソッドをPOSTにして更新
テスト送信
Script - Backgroundで実行してみます。
var restMessage = new sn_ws.RESTMessageV2("Teams通知", "メッセージ送信");
var message = "メッセージテスト";
var body = createBody(message);
restMessage.setRequestBody(body);
var response = restMessage.executeAsync();
function createBody(message) {
var body = {
type : "message",
text : message
};
return new JSON().encode(body);
}
ビジネスルールを設定
変更要求の更新をトリガーにしてメッセージを送信するビジネスルールを作成
実行タイミングは非同期にしています。
ChangesやChangesToは変更前が無いから非同期では使えないと思っていたのですが、コンディションビルダーで使用する場合には使えるらしいです。知らなかった。
https://docs.servicenow.com/bundle/paris-application-development/page/script/business-rules/reference/r_HowBusinessRulesWork.html
コードはこんな感じで書いてみる
(function executeRule(current, previous /*null when async*/) {
var restMessage = new sn_ws.RESTMessageV2("Teams通知", "メッセージ送信");
var message = createMessage(current);
var body = createBody(current, message);
restMessage.setRequestBody(body);
var response = restMessage.executeAsync();
})(current, previous);
function createMessage(current) {
var url = gs.getProperty('glide.servlet.uri')+'/change_request.do?sys_id=' + current.sys_id;
var message = '【お知らせ】以下の変更を実装します!<br/>' +
'番号:<a href="' + url + '">' + current.number + '</a><br/>';
message += '作業名: ' + current.short_description + '<br/>';
message += '終了予定時刻: ' + current.end_date.getDisplayValue();
return message;
}
function createBody(current, message) {
var body = {
type : "message",
text : message
};
return new JSON().encode(body);
}