文字列フィールドを配列化する方法
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-24-2023 06:44 PM
コミュニティの皆様
いつもお世話になっております。
私のプロジェクトは、インシデントを
以下のようなDescription(文字列フィールド)で起票します。
Table: incident
Summary: testData(2022/08/10 13:00:00)
FirstDate: 2022-08-02 13:00:00
LastDate: 2022-08-10 13:00:00
ID: XX1 TEST_20220810_1234_33
Desc: テスト起票
Group: Help Desk
Table等それぞれ項目を配列化して、
Table名が"incident"の場合や、First Dateが他のインシデントを被っている場合、
インシデントをキャンセルする等の処理を行いたいのですが、
文字列フィールドから配列にすることは可能でしょうか。
※サンプルコードもあると助かります。

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-24-2023 08:35 PM
table名はincidentとfirst dateは他のincidentのレコード同じでしたら新しい作成されたレコードのステータスをcloseするってことですか。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-24-2023 08:39 PM
すみません、上記あくまで例で、
部分一致の項目は現在お客様に確認中となっております。
Table名がincidentの場合はクローズしないです。
例として、SummaryやDescの内容が被っていたら、クローズの場合、
Splitを使うにしても改行だけでは足りないような気がしているので、
調べているといった状況です。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-24-2023 09:08 PM
自分が処理するなら
incidentのDescriptionフィールドにJSON形式で書込みして、bussiness rule内でjson - 辞書配列の変換し、レコード操作すると思います。
JSONにするのが難しかったら、テキストを1行単位で抜き取りする処理して値を個別の変数に格納するとかでしょうか
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-25-2023 02:25 AM - edited 01-25-2023 02:40 AM
ためしにAIのChatGPTにサンプルコードを作成してもらいました。日本語で処理内容をChatGPTに伝えて作ってもらいました。こんな作り方も面白いかもしれません。
var input = gs.getMessage("Table: incident\nSummary: testData(2022/08/10 13:00:00)\nFirstDate: 2022-08-02 13:00:00\nLastDate: 2022-08-10 13:00:00\nID: XX1 TEST_20220810_1234_33\nDesc: テスト起票\nGroup: Help Desk");
var lines = input.split("\n");
var keyValueArr = [];
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
var parts = line.split(":");
var key = parts[0].trim();
var value = parts[1].trim();
var obj = {};
obj[key] = value;
keyValueArr.push(obj);
}
for(var i=0; i< keyValueArr.length; i++){
gs.info(JSON.stringify(keyValueArr[i]));
}
ChatGPTによるプログラムの説明は以下のとおりです。
上記のJavaScriptのコードは、入力された文章を改行で分割し、それぞれの行に対して「:」の前後の単語を抽出し、その前後の空白を取り除い、KeyとValueをObject形式で配列に格納します。それから配列をループで回して、ひとつずつログ出力します。
Objectを作成して、key-value形式で値を格納し、keyValueArrにpushします。 JSON.stringify()メソッドを使用して、Object形式を文字列に変換し、gs.info()を使用してログに出力します。
実際にServiceNowで実行した結果は以下のようなログが出力されます。
{"Table":"incident"}
{"Summary":"testData(2022/08/10 13"}
{"FirstDate":"2022-08-02 13"}
{"LastDate":"2022-08-10 13"}
{"ID":"XX1 TEST_20220810_1234_33"}
{"Desc":"テスト起票"}
{"Group":"Help Desk"}
一度この記事を投稿した後でバグに気づきました。
「{"Summary":"testData(2022/08/10 13"}」これは13から後ろの「:」で区切られて消えています。
プログラムの修正をChatGPTに伝えて、直してもらったのか以下のプログラムです。
var input = gs.getMessage("Table: incident\nSummary: testData(2022/08/10 13:00:00)\nFirstDate: 2022-08-02 13:00:00\nLastDate: 2022-08-10 13:00:00\nID: XX1 TEST_20220810_1234_33\nDesc: テスト起票\nGroup: Help Desk");
var lines = input.split("\n");
var keyValueArr = [];
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
var parts = line.split(":");
var key = parts[0].trim();
var value = parts.slice(1).join(':').trim();
var obj = {};
obj[key] = value;
keyValueArr.push(obj);
}
for(var i=0; i< keyValueArr.length; i++){
gs.info(JSON.stringify(keyValueArr[i]));
}
結果は以下のとおり。
{"Table":"incident"}
{"Summary":"testData(2022/08/10 13:00:00)"}
{"FirstDate":"2022-08-02 13:00:00"}
{"LastDate":"2022-08-10 13:00:00"}
{"ID":"XX1 TEST_20220810_1234_33"}
{"Desc":"テスト起票"}
{"Group":"Help Desk"}