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

提供しているスクリプトとの詳しい差分は下記リンクのオプション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で実現したいと思いますが、今後の参考とさせていただきます。