0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-02-17

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

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

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

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

image.png

Flowでやる

Flowの作成

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

image.png

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

image.png

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

image.png

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

image.png

Flowを週次で実行する設定

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

image.png

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

image.png

Flowのふるまいの設定

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

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

image.png

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

image.png

メール送信のActionを追加

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

image.png

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

image.png

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

image.png

FlowのTest

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

image.png

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

image.png

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

image.png

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

<p data-tinymcerootblock="">54</p>

というリンクがあるのでクリックしたところダイアログで 54 というカウントした結果がプレビューできました

image.png

FlowのActivate

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

image.png

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

image.png

FlowのERROR HANDLER

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

image.png

Scheduled Job, Event Registry, Notificationでやる

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

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

Event Registryの作成

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

image.png

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

image.png

Scheduled Jobの作成

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

image.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

翻訳にかけてみて

image.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

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

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

//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つ指定してしまっています

gs.eventQueue("Out Mail Event", "", gr_u.getRowCount()); 

Notificationの作成

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

${event.parm1}

動作確認

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

image.png

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

image.png

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

image.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

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

image.png

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

image.png

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

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?