はじめに
FormのReference fieldに表示される値は、Reference先のTableのDisplay fieldの値になります。Table定義で、特定のFieldがDisplay指定されていれば、そのField、あるいは、どのFieldもDisplay指定されていなければ、nameやu_nameフィールドがDisplay valueになります。
ここでは、英語以外のLanguage pluginがインストールされ、ユーザーがPreferred Languageを選択できる環境において、ユーザーが選択しているLanguageに合わせて、Reference fieldの表示する値も、その言語の値に自動的に切り替える方法をCompany tableを例に紹介します。
[参照] Display valueの設定方法とDisplayされるfieldの優先順位
https://docs.servicenow.com/bundle/vancouver-platform-administration/page/administer/field-administration/task/t_SelectTheDisplayValue.html
Table定義設定
まず、CompanyテーブのOOTBであるNameフィールドは、会社の英語名を入力する前提で、日本語名を入力するためのString fieldと英語名と日本語の両方を情報として保持するためのTranslated Text fieldを、次のように追加します。ここで、ポイントはTranslated Text fieldをDisplayに指定しておくことです。
Business Rule設定
次に、Nameフィールド(英語名)やName in Japanese(日本語名)フィールドが入力されたときに、Translated Text fieldに転記したり、Translated Text tableに対訳となる日本語名の値をもつレコードを追加・変更したりするBusiness Ruleを作成します。
1つ目のBusiness Ruleは、Before Insert/Updateで、Nameの値は、Display Nameに単純転記します。安全のため、Name in Japaneseが空だった場合は、Nameを転記して、英語名と日本語名を同一にします。
(function executeRule(current, previous /*null when async*/ ) {
// Add your code here
current.u_display_name = current.name;
if (!current.u_name_in_japanese) {
current.u_name_in_japanese = current.name;
}
})(current, previous);
2つ目のBusiness Ruleは、After Insert/Updateで、Name in Japaneseの入力値を、Translated Text tableに保持させます。値が初めて登録された場合と、既存の値が変更された場合の両方に対応させます。
(function executeRule(current, previous /*null when async*/ ) {
// Add your code here
var tableName = current.getTableName();
var diplayField = "u_display_name";
var translationLang = "ja";
var translatedValue = current.u_name_in_japanese;
var grTX = new GlideRecord("sys_translated_text");
grTX.addQuery("tablename", tableName);
grTX.addQuery("fieldname", diplayField);
grTX.addQuery("documentkey", current.sys_id);
grTX.addQuery("language", translationLang);
grTX.query();
if (grTX.next()) {
grTX.value = translatedValue;
grTX.update();
} else {
grTX.initialize();
grTX.tablename = tableName;
grTX.fieldname = diplayField;
grTX.documentkey = current.sys_id;
grTX.language = translationLang;
grTX.value = translatedValue;
grTX.insert();
}
})(current, previous);
結果の確認
事前に、Nameフィールド(英語名)やName in Japanese(日本語名)フィールドが入力されたCompanyレコードをいくつか用意します。
Abel Tuterを、そのうちのひとつに所属させます。英語環境だと、次のように見えます。Comapany fieldに会社の英語名が表示されてます。
日本語環境に切り替えると、Company fieldの値も日本語名に切り替わりました。
ついでに、中国語(簡体字)環境に切り替えると、Translated Text tableには中国語名の対訳が保持されていないため、代替として英語名が表示され、空になるようなことはありません。
なお、この表示切り替えは、Reference fieldの値を選択するList viewや、List typeのReference fieldの値を選択するSluchbucketでも有効です。ただし、List viewは、事前にDisplay Nameが表示されるようにList Layoutを変更して下さい。
日本語環境のSluchbucketの表示だけ、以下に示します。日本語以外の環境であれば、Sluchbucketの左右の選択区画に会社の英語名が表示されます。