Version: Utah
UI: Core UI
Instance: メール送信が無効なPDI(Personal Developer Instance)
誤ってメールが実在ドメインのアドレスに送信されることが無いようにご留意ください
There's More Than One Way To Do It.(TMTOWTDI)
いろいろなやり方があると思いますが3つのやり方(Flow, Scheduled job+...)を試したのでまとめてみます
Flowでやる
Flowの作成
Filter navigatorに"flow de"などと打ち込んで Process Automation -> Flow Designer のメニューを表示させてクリックします
Flow DesignerというFlowを作成するためのツールが別タブで起動します 画面右上の [New] ボタンをクリックして Flow を選択します
Nameに「[F] Out Mail(Weekly Cnt of SP Usr)」といった適当な名前を入力して [Submit] します(FlowとSubflowを一覧画面で見たときに区別がつきやすいように[F]をつけてます)
何か案内が出たので Skip tour にします
Flowを週次で実行する設定
Flowの編集画面が表示されたのでFlowの起動条件を設定するために Add a trigger を選択して SCHEDULED の中から Weekly を選択します これで「週次で実行」する条件になったはずです
毎週月曜日の10:00に送信するとして Day of Week から Monday を選択して Time で 10 h を設定してDoneします
Flowのふるまいの設定
特定のロールを持っているユーザー数をカウントするActionの追加
起動条件が出来たので次はFlowのふるまいを設定します ACTIONS の Add an Action, Flow Logic, or Subflow をクリックして Action をクリックして表示されるダイアログから ServiceNow Core を選択して表示されたリストの中から Look Up Records を選択します
Tableで User(sys_user) を選択してConditionで Roles is itil を設定し なんとなしにMax Resultsを 1,000 から 100,000 に増やしてDoneします
メール送信のActionを追加
これで特定のロールを持っているユーザー数をカウントできたので結果をメールで送信する処理を追加します 先ほどと同様に ACTIONS の Add an Action, Flow Logic, or Subflow をクリックして Action から ServiceNow Core を選択して表示されたリストの中から Send Email を選択します
Toにテスト用の @example.com などの宛先を設定しSubjectに適当な値を設定しBodyは項目右側にある魔法の杖のアイコン(Data Pill Picker for Body)をクリックして表示されるメニューの中から 1 - List Of Records の Count を選択します これで1つ前のActionのレコードの件数がBodyに設定されるはずです
Bodyに変数が設定されたことを確認してDoneします
FlowのTest
Flowが出来たのでTestしてみます
画面右上の Test をクリックするとダイアログが表示されるので Run Test をクリックします
しばらくするとダイアログの中央に Your test has finished running. View the flow execution details. というリンクが表示されるのでクリックします
結果がComplateになっていました Send Email の結果を開いたところ Body に
<p data-tinymcerootblock="">54</p>
というリンクがあるのでクリックしたところダイアログで 54 というカウントした結果がプレビューできました
FlowのActivate
Testが完了したFlowを Save して Activate して有効にします
Activateに成功すると画面右下にSuccessのメッセージが表示されます
FlowのERROR HANDLER
この記事では記述が長くならないようにサボっていますがFLowを作る際には必ずエラーハンドリングを入れてFlowが失敗したときに気付けるようにしたほうがいいと思います
Scheduled Job, Event Registry, Notificationでやる
定期的に起動されるScheduled JobがEventを実行してNotificationでメール送信する仕組みを作ってみます Eventのドキュメントは以下です
イベントは、特定の条件が発生したときにシステムがログに記録し、その条件に応じて何らかのアクションを実行するために使用する特別なレコードです。
システムは、ビジネスルールを使用してシステム条件を監視し、イベント [sysevent] テーブル (イベントログまたはイベントキューとも呼ばれます) のイベントレコードを生成します。
Event Registryの作成
間に入るEvent Registryを最初に作ります Filter navigatorに"registry"などと入力してSystem Policy - ▼ Event - Registyのメニューに絞り込んでクリックしてEvent Registryの一覧画面を表示します
New をクリックしてNameに「Out Mail Event」といった適当な値を入力してSubmitします
Scheduled Jobの作成
定期的に実行するScheduled Jobを作成します Filter navigatorに"scheduled j"などと入力して System Definition - Scheduled Jobs のメニューに絞り込んでクリックして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
翻訳にかけてみて
Event Registryを実行するScriptを書きたいので Automatically run a script of your choosing をクリックしてNameに「Weekly Fire Starter」といった適当な値を入力してRunをWeeklyにしてDay(run_dayofweek)でMondayを選択してTimeでHoursを10に設定して
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の一覧を表示します
Newをクリックして表示されるNotificationの作成画面でNameに「Send Cnt of SP Usr」といった適当な名前を入力してWhen to sendタブのSend WhenでEvent is firedを選択してEvent nameは作成済みのEvet Registryを選択して
Who will receiveのタブで宛先を指定します とりあえずUsersを選択してメールのアイコンの横にテスト用の @example.com などのアドレスを入力して
メールのアイコンをクリックして設定します
What will containタブでSubjectに適当な値を入力して
MessageHTMLに以下の値を入力してSubmitします Eventを起動する際の引数を変数として本文に設定しています(1つめの引数のparameter1ということでparm1なんだと思います)
${event.parm1}
動作確認
Filter navigatorに"scheduled j"などと入力して System Definition - Scheduled Jobs のメニューに絞り込んでクリックしてScheduled Jobの一覧画面を表示させるなどしてから作成したScheduled Jobの画面に遷移して Execute Now します
Filter navigatorに"mailbox"などと入力してメニューを絞り込んでからSysyem Mailboxes - ▼Outbound - Outboxをクリックして送信トレイのメール一覧を確認します
テストしたレコードが見つかったら選択してからPreviewすると本文が確認できます
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
ひょっとして Automate the generation and distribution of a report で簡単できるのでは?と思ってクリックしてみたところ集計した結果をメールで送るための設定画面が表示されていつの間にこんな便利な機能が出来たのかとびっくりしました
設定項目に Report があるので定義済みのReportを指定したファイル形式(CSV, PNG, PDFなど)で定期的に送信することができそうです(未確認です) 特定のロールを持っているユーザー数をカウントするReportを作っておいて指定するならこちらでも実現できそうです
気になったので少し試してみたのですがReportが選択出来ず…どうもカウントするReportはこの機能では使えないようです