ServiceNowからTeamsに通知を飛ばす


概要

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で実行してみます。

bg_script.js
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

コードはこんな感じで書いてみる

send_change_implementation.js
(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);
}

結果がこちら