javascript:gs.dateGenerateで日付/時刻型の変数を使用する方法について

a_129
Mega Guru

find_real_file.png

上記画像のようにjavascript:gs.dateGenerateの引数に日付/時刻型の変数を使用しようとしているのですがエラーになってしまいます。
javascript:gs.dateGenerateで変数の値を引数にする方法はあるでしょうか?
ご存じでしたらご教授いただければ幸いです。
 
1 件の受理された解決策

iwai
Giga Sage

javascript:gs.dateGenerate(日付,時間) この形式で使用します。

javascript:gs.dateGenerate(fd_data._1__get_catalog_variables.work_start)

これでは日付しか渡していないことになります。この関数は日付だけだと空白を返します。そのため正しいQueryができません。

ただし今回は全く別の問題があります。

そのVariablesのwork_startとwork_endは日時タイプの変数だとすると、内部値はUTC 時間(時差なし)で保存されているはずです。
dateGenerate関数はユーザー時間(例:日本時間+9)からUTC時間(時差なし)に変換する関数です。
リストビューの検索時にこれを使うのはリストビューで手動で入力するのが日本時間のため、UTC時間に変換して検索するためです。
work_startが日時タイプの場合はUTC時間で格納されているため、dateGenerate関数を使う必要がありません。

return 'active=true^opened_at>='+fd_data._1__get_catalog_variables.work_start+'^opened_at<='+fd_data._1__get_catalog_variables.work_end;

今回の問題とは別ですが、Scriptで検索していると言うことは、通常のFilterでwork_startを渡しても正しく検索しなかったためScriptを使っていると予想します。FlowをTest実行してみると、通常のFilterだと何故か表示値(日本時間+9)で検索してしまいます。そのため意図した検索になりません。なんだか腑に落ちない仕様です。

元の投稿で解決策を見る

3件の返信3

iwai
Giga Sage

javascript:gs.dateGenerate(日付,時間) この形式で使用します。

javascript:gs.dateGenerate(fd_data._1__get_catalog_variables.work_start)

これでは日付しか渡していないことになります。この関数は日付だけだと空白を返します。そのため正しいQueryができません。

ただし今回は全く別の問題があります。

そのVariablesのwork_startとwork_endは日時タイプの変数だとすると、内部値はUTC 時間(時差なし)で保存されているはずです。
dateGenerate関数はユーザー時間(例:日本時間+9)からUTC時間(時差なし)に変換する関数です。
リストビューの検索時にこれを使うのはリストビューで手動で入力するのが日本時間のため、UTC時間に変換して検索するためです。
work_startが日時タイプの場合はUTC時間で格納されているため、dateGenerate関数を使う必要がありません。

return 'active=true^opened_at>='+fd_data._1__get_catalog_variables.work_start+'^opened_at<='+fd_data._1__get_catalog_variables.work_end;

今回の問題とは別ですが、Scriptで検索していると言うことは、通常のFilterでwork_startを渡しても正しく検索しなかったためScriptを使っていると予想します。FlowをTest実行してみると、通常のFilterだと何故か表示値(日本時間+9)で検索してしまいます。そのため意図した検索になりません。なんだか腑に落ちない仕様です。

返信ありがとうございます。

頂いた内容を参考に以下スクリプトを作成しました。

var query = "active=true^work_start<="+fd_data._1__get_catalog_variables.work_start +"^work_end>="+fd_data._1__get_catalog_variables.work_end;
return query

fd_dataの中身をログで確認したところ、ユーザー時間が正しく格納されていました。find_real_file.png

しかし以下画像の通り、Look Up Reocordsに作成したスクリプトを記載したところ、work_startがUTC時間となってしまいます。

find_real_file.png

 

解決方法をご存知でしたら教えていただけると幸いです。

それが正しい動作になります。

Queryによる検索はUTCで行います。
表示はユーザー時間で表示します。
Recordに格納されているデータはUTCで、表示するときにユーザー時間になります。
そして Look Up Records のQueryはUTCで検索します。
Log の メッセージについては、すこし小難しい話になりますが、Scriptに記述しているその変数は表示値と内部値の両方を持った状態です。そのため表示するときに表示値を表示するか内部値を表示するかはServiceNow側の仕様によって決まります。Log メッセージの場合は表示値を表示しています。