Inboud Actionで要求アイテムを作成時にフローを実行する方法について

shirakazu
Tera Expert

Inboud Actionで要求、要求アイテムを作成した際にカタログアイテムで設定されているフローを実行する方法があれば教えていただけないでしょうか?

 

2 件の受理された解決策

提供しているスクリプトとの詳しい差分は下記リンクのオプション3を見るとわかると思いますが、CartAPIなしの場合において、カタログに定義されたフローを実行するには、オプション 3 のような記載が必要なようです。
コードを使用して ServiceNow カタログ要求を送信する方法

個人的にここまでスクリプトを書くかつ非推奨なスクリプトなら、そもそもメールでカタログをリクエストする運用自体を考え直したいなと思うので、こちらは実際にInbound mail actionで実行できるかまでは確認してません。

また同リンクのオプション1のCartJS APIでInbound mail actionを実装してみましたが、こちらも上手くいきませんでした。

 

一応スクリプトを載せます。

 

バックグラウンドスクリプトで実行するとカタログに設定されたFlowの実行まで動作しますが、Inbound mail actionでは上手く実行できませんでした。現在ではアイテムのリクエストをスクリプトで操作するにはCartJS APIが推奨されますが、Inbound mail actionでは相性が悪いのか...?引き続き試してみて下さい。

 

 

 

var itemName = "Standard Laptop";

    // カタログアイテムを検索し、sys_idを取得
    var scCatItem = new GlideRecord("sc_cat_item");
    scCatItem.addQuery('name', itemName);
    scCatItem.query();

    if (scCatItem.next()) {
        var itemSysId = '';
        itemSysId = scCatItem.getValue('sys_id'); // sys_idを取得
        gs.info('Inbound mail action:Request Catalog/ Reuest Catalog SYS ID is : ' + itemSysId);

        // カートのインスタンスを作成
        var cart = new sn_sc.CartJS();

        // カタログアイテムをJSONオブジェクトとして定義
        var requestItem = {
            'sysparm_id': itemSysId, //カタログのsys_id
            'sysparm_quantity': '1', //数量
            'variables': {
                'acrobat': 'true',
                'photoshop': 'false',
            }
        };

        //JSON文字列に変換
        requestItem = JSON.stringify(requestItem);
        //jsオブジェクトに変換
        requestItem = JSON.parse(requestItem);

        // カートにアイテムを追加
        var cartDetails = cart.addToCart(requestItem); // ここではitemがオブジェクトである必要があります

        // カートをチェックアウトするためにリクエストをJSONオブジェクトとして定義
        var requestInfo = {
            'special_instructions': '',
            'requested_for': "6816f79cc0a8016401c5a33be04be441", // admin user
            'delivery_address': "",
        };

        //JSON文字列に変換
        requestInfo = JSON.stringify(requestInfo);
        //jsオブジェクトに変換
        requestInfo = JSON.parse(requestInfo);

        // オーダーを送信
        var requestDetails = cart.submitOrder(requestInfo); // requestもオブジェクト形式で渡す
        gs.info('Inbound mail action:Request Catalog/ Reuest Order Info: ' + JSON.stringify(requestDetails)); // 結果をログに出力


    } else {
        gs.error('Inbound mail action:Request Catalog/ No catalog item found with the name: ' + itemName);
        // アイテムが見つからなかった場合は、処理を中断する
    }

 

 

 

 
また、ちゃんと試せずに恐縮ですが、CartAPIであれば、以下のリンクで上手くいっている報告がありました。
解決済み: インバウンド アクションからカタログ アイテムを送信する - ページ 3 - ServiceNow Community

さらに、以下のYouTubeでInbound mail actionをFlowで実装する方法もあります。

この場合、カタログ変数の値をメール本文から取得が難しいのですが、ただリクエストするだけならこちらの方が実装は楽です。
Submit a catalog item through inbound email | Flow Designer | ServiceNow

 

FlowのInbound mail actionでカタログ変数をメール本文で取得する議論は、以下のcommunityスレッドで議論されています。こちらも含めて、Flowでもnbound mail actionでカタログをリクエストできそうです。
解決済み: 受信メールフローを使用したメール本文の解析 - ServiceNow Community

元の投稿で解決策を見る

shirakazu
Tera Expert

こんにちは
@senon さん

教えていただいた方法をいくつか試してみましたところ、CartAPIの以下の方法で実現することができました。

解決済み: インバウンド アクションからカタログ アイテムを送信する - ページ 3 - ServiceNow Community

cart.addItemのところを対象カタログアイテムにするだけでとりあえず最低限の実行ができました。

色々と情報ありがとうございました。

 

情報までにコードを掲載させていただきます。

 

Inbound Action: Create Requested Item

Table: sc_request

 

Script:

(function runAction( /*GlideRecord*/ current, /*GlideRecord*/ event, /*EmailWrapper*/ email, /*ScopedEmailLogger*/ logger, /*EmailClassifier*/ classifier) {
       // Implement email action here
        var cartId = GlideGuid.generate(null);
        var cart = new Cart(cartId);

        var item = cart.addItem('48babbe693f95a10188776fd1dba107e'); // Test Item by mail
        var rc = cart.placeOrder();

        var ritmRec = new GlideRecord("sc_req_item");
        ritmRec.addQuery("request", rc.sys_id);
        ritmRec.query();
        if (ritmRec.next()) {
            ritmRec.short_description = email.subject.toString();
            ritmRec.comments = "received from: " + email.origemail + "\n\n" + email.body_text;
            ritmRec.contact_type = "email";
            ritmRec.update();
        }
        //update target in email table, as it won't be updated as the record was inserted through cart API
        if (rc != '') {
            var email_rec = new GlideRecord('sys_email');
            email_rec.get(sys_email.sys_id);
            email_rec.instance = rc.sys_id;
            email_rec.target_table = "sc_request";
            email_rec.update();
        }

})(current, event, email, logger, classifier);

 

FlowのInbound mail actionについても参考になりました。ありがとうございました。
今回はInbound Action & CartAPIで実現したいと思いますが、今後の参考とさせていただきます。

元の投稿で解決策を見る

6件の返信6

senon
Tera Sage

こんにちは。 @shirakazu さん

カタログにセットされているFlowは、フローデザイナーのトリガーアクションの「カタログ」によって実行されます。つまり、そこにセットしているFlowをキックするにはカタログをリクエストする必要があります。

しかし、今回の場合ですが単純にFlowを実行する必要があるので、要求アイテムが作られてたタイミングで実行されるbusiness ruleを作成し、指定のFlowを実行するAPIを使用すれば、Flowを実行することができます。

FlowAPI - スコープ指定、グローバル

しかし"Mail Inbound Actionで要求アイテムを作成する"という要件に疑問を感じます。
もし、それがメールでカタログリクエストを受け付けるための実装であれば、あまり推奨されない実装だと、私なら考えます。

 

もしメールでカタログをリクエストすることが要求なのでしたら、Mail Inbound Actionでカタログをリクエストするようにスクリプトを作成する方法が良いと思います。

以下のリンクはこの実装アイデアになるかもしれません。
解決済み: メール受信アクションでカタログリクエストを作成 - ServiceNow Community
CartJS - スコープ指定

 

また、私の考えが全く違うのであれば、ご容赦下さい。加えて"何を達成するため"に、質問内容の実装方法を求めているのかを記載していただくと、別の良いアプローチを考えることができますので、もしよろしければ、お書きください。

 

shirakazu
Tera Expert

こんにちは。

@senon さん

回答ありがとうございます。

やりたいこととしてはMail Inbound Actionからカタログをリクエストしたいが正しい要件になります。

ご指摘いただきありがとうございます。

当方まだまだ実装経験が少なく言葉足らずにところありますが、今後は"何を達成するため"を加えて質問をさせていただきたいと思います。

 

先ずは回答いただいたリンクを参考に実装ができそうか確認してみたいと思います。

良かったです。
他にもcommunityに同様な質問がありました。
解決済み: インバウンドアクションからカタログアイテムを送信する - ServiceNow Community
英語にはなりますが、英語で検索すると同様な情報がヒットすることが多いです。

もし、自分が作成したものが上手くいったら、他のユーザーの手助けができるように、
このスレッドに実装方法を記載してみてください。

@senon さん
情報ありがとうございます。
頂いた解決案を参考に試しに実装してみました。
カタログアイテムで要求、要求アイテムの作成ができました。ただ、カタログアイテムに設定されているフローが動作しない状態で作成がされました。フローを実行は何かほかに処理が必要になりますでしょうか?
対象のカタログアイテムについて、ポータルサイトから申請した場合は正しくフローが動くことは確認しております。

画面上の要求:RITM0011523はポータルサイトから作成したケース
画面下の要求:RITM0011520はInboud Actionから作成したケース

shirakazu_1-1731664685049.png


コードは以下になります。CartAPIを使用しない実装としています。
Inbound Action: Create Requested Item

Table: sc_req_item

Script:

 

(function runAction( /*GlideRecord*/ current, /*GlideRecord*/ event, /*EmailWrapper*/ email, /*ScopedEmailLogger*/ logger, /*EmailClassifier*/ classifier) {
    // Implement email action here
    createRequest();

function createRequest() {
    //Create Request
    var grRequest = new GlideRecord ("sc_request");
    grRequest.initialize();
    grRequest.requested_for = 'c2f31275c3b812105f479ef01501313c'; // snow user
    grRequest.short_description = email.subject.toString();
    grRequest.description = "received from: " + email.origemail + "\n\n" + email.body_text;
    var requestSysId = grRequest.insert();

    //Create Request Item
    current.requested_for = 'c2f31275c3b812105f479ef01501313c'; // snow user
    current.short_description = email.subject.toString();
    current.description = "received from: " + email.origemail + "\n\n" + email.body_text;
    current.cat_item = '48babbe693f95a10188776fd1dba107e'; // Test Item by mail
    current.parent = requestSysId;
    current.request = requestSysId;
    current.assignment_group='c0a8080f93f59a10188776fd1dba1045'; // sd_test01
    current.priority= 'PR3';
    current.insert();
    }

})(current, event, email, logger, classifier);