ファイル添付の自動化について

Yuki21
Tera Expert

現在、テーブルに存在するレコード数分、ローカルに保管してあるCSVファイルを添付する作業を行っておりますが、一度に100ファイルをそれぞれのレコードに手作業で添付しています。(1つレコードに1つのCSVファイルを添付します)

手作業のため作業に大変時間を要しており、CSVファイルの保管先と添付するテーブルを指定すれば自動で添付ファイルとして格納できる自動化ツールがあればと思っておりますが、そのようなことが可能かご存知でしたらご教示いただけなれば幸いです。
※MIDサーバは使用できません

1 ACCEPTED SOLUTION

iwai
Giga Sage

定期的に自動でやるならば、すでに投稿されている通り、Attachment API を使った Powershell や Python などの Programを作ると良いと思います。

もし、ほとんど繰り返さない作業ならば、下記のような作業の後Scriptを実行することでも可能です。UI ActionのScriptとして登録するのも良いかもしれません。

  1. PC上で100ファイルを選択した状態で、CSV保存先となるひとつのレコード(作業用なのでどのレコードでも良いです)にマウスでドラックアンドドロップして添付します。(ServiceNowのひとつのレコードに添付できる上限はありません、100ファイルでも1回の操作で登録できます)
  2. Scripts Backgroundに下記Scriptを張り付けて、CSV保存先テーブルやそのSYSID、添付するテーブルを環境に合わせて変更してScriptを実行。
    このスクリプトはCSV保存先に格納されている添付ファイルを、ひとつずつ添付するテーブルに移動させています(格納先のテーブル名とSYSIDを書き換えることで移動ししたことになる)
// CSVファイル保存先と添付するテーブルを指定して自動的に格納する
var grAttachment = new GlideRecord('sys_attachment');//添付ファイル格納システム用テーブル(システム固定)
grAttachment.addQuery('table_name', 'incident'); //添付したテーブル名(CSVファイル保存先)
grAttachment.addQuery('table_sys_id', '91511a8e1bedc110a90c32e8cd4bcb3f'); //添付したテーブルのレコードSYSID
grAttachment.query();
var gr;
while (grAttachment.next()) {
    // 新規作成
    gr = new GlideRecord('incident'); //添付先テーブル名(添付するテーブル)
    gr.initialize();
    gr.newRecord();
    gr.description = grAttachment.file_name; // 簡単な初期値
    if (gr.insert()) {
        // 作成したレコードに添付ファイルを移動する
        grAttachment.table_name = 'incident';
        grAttachment.table_sys_id = gr.sys_id;
        grAttachment.update();
    }
}

 

もし既存のレコードがあって、既存のレコードを見つけてきて添付ファイルを移動させたい場合は下記のようなScriptを参考に、要望に合わせて改造してみてください。

// 添付元レコードから添付先レコードに添付ファイルを移動させるスクリプト
// 添付先レコードは、添付ファイル名を説明欄に含むレコードを検索して指定する
// 添付したテーブル名とSYSID、添付先検索条件、添付先テーブル名などは、環境に合わせて変更してください。
var grAttachment = new GlideRecord('sys_attachment');//添付ファイル格納システム用テーブル(システム固定)
grAttachment.addQuery('table_name', 'incident'); //添付したテーブル名(CSVファイル保存先)
grAttachment.addQuery('table_sys_id', '91511a8e1bedc110a90c32e8cd4bcb3f'); //添付したテーブルのレコードSYSID
grAttachment.query();
var gr;
while (grAttachment.next()) {
    gr = new GlideRecord('incident'); //添付先テーブル名(添付するテーブル)
    // 添付先検索条件:説明にファイル名を含む 場合、見つかったレコードに添付ファイルを移動する
    gr.addQuery('description', 'CONTAINS', grAttachment.file_name);
    gr.setLimit(1);
    gr.query();
    if (gr.next()) {
        // 見つかったレコードに添付ファイルを移動する
        grAttachment.table_name = 'incident';
        grAttachment.table_sys_id = gr.sys_id;
        grAttachment.update();
    } else {
        // 見つからない場合
        //新規作成
        gr = new GlideRecord('incident');
        gr.initialize();
        gr.newRecord();
        gr.description = grAttachment.file_name;
        if (gr.insert()) {
            // 作成したレコードに添付ファイルを移動する
            grAttachment.table_name = 'incident';
            grAttachment.table_sys_id = gr.sys_id;
            grAttachment.update();
        }
    }
}

View solution in original post

4 REPLIES 4

Hitoshi Nakamur
Tera Contributor

お疲れ様です、中村と申します。

ファイルの添付についてはAttachement APIというものがあり、これでAPIで添付ファイルを送りこむことができます。
添付ファイルはsys_attachmentテーブルで管理しているので、このテーブルに送り込みます。

https://[instance name].service-now.com/nav_to.do?uri=%2Fsys_attachment_list.do

Attachment API | ServiceNow Developers

中村様

ご回答いただきありがとうございます。
ご教示いただいたAPIで連携する方法で検討を進めたいと思います。

iwai
Giga Sage

定期的に自動でやるならば、すでに投稿されている通り、Attachment API を使った Powershell や Python などの Programを作ると良いと思います。

もし、ほとんど繰り返さない作業ならば、下記のような作業の後Scriptを実行することでも可能です。UI ActionのScriptとして登録するのも良いかもしれません。

  1. PC上で100ファイルを選択した状態で、CSV保存先となるひとつのレコード(作業用なのでどのレコードでも良いです)にマウスでドラックアンドドロップして添付します。(ServiceNowのひとつのレコードに添付できる上限はありません、100ファイルでも1回の操作で登録できます)
  2. Scripts Backgroundに下記Scriptを張り付けて、CSV保存先テーブルやそのSYSID、添付するテーブルを環境に合わせて変更してScriptを実行。
    このスクリプトはCSV保存先に格納されている添付ファイルを、ひとつずつ添付するテーブルに移動させています(格納先のテーブル名とSYSIDを書き換えることで移動ししたことになる)
// CSVファイル保存先と添付するテーブルを指定して自動的に格納する
var grAttachment = new GlideRecord('sys_attachment');//添付ファイル格納システム用テーブル(システム固定)
grAttachment.addQuery('table_name', 'incident'); //添付したテーブル名(CSVファイル保存先)
grAttachment.addQuery('table_sys_id', '91511a8e1bedc110a90c32e8cd4bcb3f'); //添付したテーブルのレコードSYSID
grAttachment.query();
var gr;
while (grAttachment.next()) {
    // 新規作成
    gr = new GlideRecord('incident'); //添付先テーブル名(添付するテーブル)
    gr.initialize();
    gr.newRecord();
    gr.description = grAttachment.file_name; // 簡単な初期値
    if (gr.insert()) {
        // 作成したレコードに添付ファイルを移動する
        grAttachment.table_name = 'incident';
        grAttachment.table_sys_id = gr.sys_id;
        grAttachment.update();
    }
}

 

もし既存のレコードがあって、既存のレコードを見つけてきて添付ファイルを移動させたい場合は下記のようなScriptを参考に、要望に合わせて改造してみてください。

// 添付元レコードから添付先レコードに添付ファイルを移動させるスクリプト
// 添付先レコードは、添付ファイル名を説明欄に含むレコードを検索して指定する
// 添付したテーブル名とSYSID、添付先検索条件、添付先テーブル名などは、環境に合わせて変更してください。
var grAttachment = new GlideRecord('sys_attachment');//添付ファイル格納システム用テーブル(システム固定)
grAttachment.addQuery('table_name', 'incident'); //添付したテーブル名(CSVファイル保存先)
grAttachment.addQuery('table_sys_id', '91511a8e1bedc110a90c32e8cd4bcb3f'); //添付したテーブルのレコードSYSID
grAttachment.query();
var gr;
while (grAttachment.next()) {
    gr = new GlideRecord('incident'); //添付先テーブル名(添付するテーブル)
    // 添付先検索条件:説明にファイル名を含む 場合、見つかったレコードに添付ファイルを移動する
    gr.addQuery('description', 'CONTAINS', grAttachment.file_name);
    gr.setLimit(1);
    gr.query();
    if (gr.next()) {
        // 見つかったレコードに添付ファイルを移動する
        grAttachment.table_name = 'incident';
        grAttachment.table_sys_id = gr.sys_id;
        grAttachment.update();
    } else {
        // 見つからない場合
        //新規作成
        gr = new GlideRecord('incident');
        gr.initialize();
        gr.newRecord();
        gr.description = grAttachment.file_name;
        if (gr.insert()) {
            // 作成したレコードに添付ファイルを移動する
            grAttachment.table_name = 'incident';
            grAttachment.table_sys_id = gr.sys_id;
            grAttachment.update();
        }
    }
}

iwai様

ご回答いただきありがとうございます。
以下のPowershellスクリプトを作成する方法で検討を進めたいと思います。

・Attachment APIのcURLコマンドを発行
・コマンド中のsys_idとファイル保管先を可変で定義
・ファイルとレコードのsys_idを紐づける外部ファイルを参照し、可変値を書き換えた上でコマンドを繰り返し実行する