ServiceNowで週次で特定のロールを持っているユーザー数をカウントしてメールで送信する

Version: Utah
UI: Core UI
Instance: メール送信が無効なPDI(Personal Developer Instance)

:::note alert
誤ってメールが実在ドメインのアドレスに送信されることが無いようにご留意ください
:::

# There's More Than One Way To Do It.(TMTOWTDI)

いろいろなやり方があると思いますが3つのやり方(Flow, Scheduled job+...)を試したのでまとめてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c0b10ebb-51a3-02c6-6832-fe411b9fb9d1.png)

# Flowでやる

## Flowの作成

Filter navigatorに"flow de"などと打ち込んで Process Automation -> Flow Designer のメニューを表示させてクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f492cb3c-896a-3f1d-273f-624e441db941.png)

Flow DesignerというFlowを作成するためのツールが別タブで起動します 画面右上の [New] ボタンをクリックして Flow を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/924e0734-f9e7-0ba0-3a10-4de8526fca74.png)

Nameに「[F] Out Mail(Weekly Cnt of SP Usr)」といった適当な名前を入力して [Submit] します(FlowとSubflowを一覧画面で見たときに区別がつきやすいように[F]をつけてます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/fb98d95d-58a0-f93b-d6a2-4ab10fbf7ee7.png)

何か案内が出たので Skip tour にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/27e86a6b-a8ee-c3da-faf0-f3671fe746fd.png)

## Flowを週次で実行する設定

Flowの編集画面が表示されたのでFlowの起動条件を設定するために Add a trigger を選択して SCHEDULED の中から Weekly を選択します これで「週次で実行」する条件になったはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/ad83e04f-bc0a-3573-8901-3a2f0ea31135.png)

毎週月曜日の10:00に送信するとして Day of Week から Monday を選択して Time で 10 h を設定してDoneします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/456c9e08-a094-b93b-1eef-19467c26b4d9.png)

## Flowのふるまいの設定
### 特定のロールを持っているユーザー数をカウントするActionの追加

起動条件が出来たので次はFlowのふるまいを設定します ACTIONS の Add an Action, Flow Logic, or Subflow をクリックして Action をクリックして表示されるダイアログから ServiceNow Core を選択して表示されたリストの中から Look Up Records を選択します 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/85d6ce7f-be71-0795-e899-141a998d9038.png)

Tableで User(sys_user) を選択してConditionで Roles is itil を設定し なんとなしにMax Resultsを 1,000 から 100,000 に増やしてDoneします 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f6f8f7f2-57d9-e49a-49e7-a84d44d231a2.png)

### メール送信のActionを追加

これで特定のロールを持っているユーザー数をカウントできたので結果をメールで送信する処理を追加します 先ほどと同様に ACTIONS の Add an Action, Flow Logic, or Subflow をクリックして Action から ServiceNow Core を選択して表示されたリストの中から Send Email を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/a80a8a47-93a4-feb5-0cd2-a5097e5ef580.png)

Toにテスト用の @example.com などの宛先を設定しSubjectに適当な値を設定しBodyは項目右側にある魔法の杖のアイコン(Data Pill Picker for Body)をクリックして表示されるメニューの中から 1 - List Of Records の Count を選択します これで1つ前のActionのレコードの件数がBodyに設定されるはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/6520d8dc-26de-8255-3731-f4eeec9ea525.png)

Bodyに変数が設定されたことを確認してDoneします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/59d2bff7-780c-e6ae-f262-e9f9f73b122b.png)

## FlowのTest

Flowが出来たのでTestしてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/08105ad2-2769-3851-d3a3-b896e8d0f630.png)

画面右上の Test をクリックするとダイアログが表示されるので Run Test をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c7eb55cc-c05a-1ca5-6bee-02053b1a25c7.png)

しばらくするとダイアログの中央に Your test has finished running. View the flow execution details. というリンクが表示されるのでクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/8b733ca0-2671-969f-67e6-8261c0fa214a.png)

結果がComplateになっていました Send Email の結果を開いたところ Body に

```
<p data-tinymcerootblock="">54</p>
```
というリンクがあるのでクリックしたところダイアログで 54 というカウントした結果がプレビューできました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/b345aae5-b9a2-e809-5fb3-011e8fdb6410.png)

## FlowのActivate

Testが完了したFlowを Save して Activate して有効にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/1665e758-947d-c9de-9c36-77324c72f9be.png)

Activateに成功すると画面右下にSuccessのメッセージが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f185ec2a-c2bc-da95-4571-e5aac4a78140.png)

## FlowのERROR HANDLER

この記事では記述が長くならないようにサボっていますがFLowを作る際には必ずエラーハンドリングを入れてFlowが失敗したときに気付けるようにしたほうがいいと思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/5b6e41ab-c0ad-3459-19a8-cd17eee55473.png)

# Scheduled Job, Event Registry, Notificationでやる

定期的に起動されるScheduled JobがEventを実行してNotificationでメール送信する仕組みを作ってみます Eventのドキュメントは以下です

https://docs.servicenow.com/ja-JP/bundle/vancouver-build-workflows/page/administer/platform-events/concept/events.html

> イベントは、特定の条件が発生したときにシステムがログに記録し、その条件に応じて何らかのアクションを実行するために使用する特別なレコードです。
> システムは、ビジネスルールを使用してシステム条件を監視し、イベント [sysevent] テーブル (イベントログまたはイベントキューとも呼ばれます) のイベントレコードを生成します。


## Event Registryの作成

間に入るEvent Registryを最初に作ります Filter navigatorに"registry"などと入力してSystem Policy - ▼ Event - Registyのメニューに絞り込んでクリックしてEvent Registryの一覧画面を表示します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/ae27959c-8b5e-865d-20ad-2544eafd803b.png)

New をクリックしてNameに「Out Mail Event」といった適当な値を入力してSubmitします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/ac87e406-6d38-30ed-5151-37daa7a27a2c.png)

## Scheduled Jobの作成

定期的に実行するScheduled Jobを作成します Filter navigatorに"scheduled j"などと入力して System Definition - Scheduled Jobs のメニューに絞り込んでクリックしてScheduled Jobの一覧画面を表示します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/9bfda70e-5eb7-23bf-75d4-c04df2d6d258.png)

New をクリックすると以下の3つの選択肢が出て

> Automate the generation and distribution of a report
> Automatically generate something (a change, an incident, a ci, etc) from a template
> Automatically run a script of your choosing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/fd31e895-1232-b1cc-a731-926f1fa0144c.png)

翻訳にかけてみて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/8ce35c24-9d0b-2644-0aa1-05600ca85440.png)

Event Registryを実行するScriptを書きたいので Automatically run a script of your choosing をクリックしてNameに「Weekly Fire Starter」といった適当な値を入力してRunをWeeklyにしてDay(run_dayofweek)でMondayを選択してTimeでHoursを10に設定して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/aa5c079b-639e-a8f2-3cc3-34d977e5a9d9.png)

Run this scriptに以下を入力してSubmitします コメントに書いていますが検索条件に合うユーザーテーブルのレコードを取得してカウントした値を引数にEventを実行しています

カウントする処理はScript Includeに書いてそちらを呼び出すようにすることやEmail Scriptに書いてNotificationで利用するなど色々やり方がありそうですが作るものを減らせるかなとここに書いてみました

```javascript
//ServiceNowでテーブルのデータを扱うGlideRecordでUserテーブルを指定した変数を作ります
var gr_u = GlideRecord("sys_user"); 
//Userテーブルの変数にrolesがitilという検索条件を追加します
gr_u.addQuery("roles","itil"); 
//追加した条件でテーブルを検索します
gr_u.query(); 
//テーブルの件数を引数にEventを実行します
gs.eventQueue("Out Mail Event", "", gr_u.getRowCount(), gr_u.getRowCount()); 
```

最後の行の引数指定はこう書いていけると思ってたのですがNotificationで引数を上手く受け取れなかったので同じ引数を2つ指定してしまっています

```javascript
gs.eventQueue("Out Mail Event", "", gr_u.getRowCount()); 
```
## Notificationの作成

メール送信鵜用のNotificationを作成します Filter navigatorに"notifications"などと入力してメニューをしぼりこんで System Notification - ▼ Email - Notifications をクリックしてNotificationの一覧を表示します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/a820f762-5205-695c-6917-d7bbb322b034.png)

Newをクリックして表示されるNotificationの作成画面でNameに「Send Cnt of SP Usr」といった適当な名前を入力してWhen to sendタブのSend WhenでEvent is firedを選択してEvent nameは作成済みのEvet Registryを選択して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/57b1d99f-9b1f-551e-6ff7-66a3f82ecc3a.png)

Who will receiveのタブで宛先を指定します とりあえずUsersを選択してメールのアイコンの横にテスト用の @example.com などのアドレスを入力して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/be1a2b81-b1c0-57fd-f184-b4349517b624.png)

メールのアイコンをクリックして設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/ab7e3194-28fa-a86e-4e3b-f1ff4e4c74ea.png)

What will containタブでSubjectに適当な値を入力して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/81c83974-6357-f372-08a1-320f866698de.png)

MessageHTMLに以下の値を入力してSubmitします Eventを起動する際の引数を変数として本文に設定しています(1つめの引数のparameter1ということでparm1なんだと思います)

```javascript
${event.parm1}
```

## 動作確認

Filter navigatorに"scheduled j"などと入力して System Definition - Scheduled Jobs のメニューに絞り込んでクリックしてScheduled Jobの一覧画面を表示させるなどしてから作成したScheduled Jobの画面に遷移して Execute Now します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/e21f73ba-80c8-6219-899f-ba517ee827f8.png)

Filter navigatorに"mailbox"などと入力してメニューを絞り込んでからSysyem Mailboxes - ▼Outbound - Outboxをクリックして送信トレイのメール一覧を確認します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c612776d-503c-b6ef-671e-87da109d3c92.png)

テストしたレコードが見つかったら選択してからPreviewすると本文が確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/55cf8d07-81c3-7472-a03e-7a9397cd6797.png)

# Scheduled Job, Reportでもできないか

## Scheduled Jobの作成

Scheduled Jobの New をクリックして出た3つの選択肢のうち

> Automate the generation and distribution of a report
> Automatically generate something (a change, an incident, a ci, etc) from a template
> Automatically run a script of your choosing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/fd31e895-1232-b1cc-a731-926f1fa0144c.png)

ひょっとして Automate the generation and distribution of a report で簡単できるのでは？と思ってクリックしてみたところ集計した結果をメールで送るための設定画面が表示されていつの間にこんな便利な機能が出来たのかとびっくりしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/feeb84ca-99a0-d4dd-dcb0-63f95d566aa7.png)

設定項目に Report があるので定義済みのReportを指定したファイル形式(CSV, PNG, PDFなど)で定期的に送信することができそうです(未確認です) 特定のロールを持っているユーザー数をカウントするReportを作っておいて指定するならこちらでも実現できそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/d09e8ee9-bf3f-d0fb-8770-664de05ad70d.png)

気になったので少し試してみたのですがReportが選択出来ず…どうもカウントするReportはこの機能では使えないようです

https://docs.servicenow.com/ja-JP/bundle/utah-platform-administration/page/administer/reference-pages/task/schedule-report.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c04b18fd-e97f-0edd-6e4a-61696c5f8f3d.png)