ServiceNow-QA0729(Community)

### 概要
[ServiceNow Community](https://community.servicenow.com/community?id=community_forum&sys_id=75291a2ddbd897c068c1fb651f9619f3)に日夜投稿されるQAのうち、いくつか取り上げて、その内容をチェックしていく試み

#### Question1: [Service Portalのウィジェット表示を左右に出し分けたい](https://community.servicenow.com/community?id=community_question&sys_id=dbf87e321b98f010b09633f2cd4bcbfa)
hi,team
 左側にユーザー名（例：helo admin）を表示し、右側に検索バーを表示する必要があります。
私の場合、両方ともそれぞれの下に表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ddc7cbb9-6f99-48cb-9ee3-70c5e424b001.png)

### Answer
要望を実現するために、様々な方法が存在します。
例えば、次のようなCSSをページに追加することができます。

```css:
#homepage-search > div {
	display: flex;
	align-items: center;
}
#homepage-search > div > h2 {
	margin-right: 0.5em;
}
```

また、現在使用している "Welcome to the IT portal "という短い説明を削除します。
その結果、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/7b16cea6-7b09-fedc-9d45-90518856fcc1.png)

### Question2: [インシデントをカテゴリーでにカウントする際の問題](https://community.servicenow.com/community?id=community_question&sys_id=c9354fc7dba530d066f1d9d9689619ef)

インシデント数をカテゴリー別に集計したいのです。
例:
Category:  Database || No Of incidents => 4
Category:  Hardware || No Of incidents => 10

### Answer
Hi Chandan
background scriptで下記のコードを試してみてくださいね.

```javascript:
//インシデントの数は、インシデントテーブルの現在の状態に応じて変化する
var count = new GlideAggregate('incident');
//count.addQuery('active', '=','true');
count.addAggregate('COUNT', 'category');
count.query();  
while (count.next()) {
   var category = count.category;
   var categoryCount = count.getAggregate('COUNT', 'category');
   gs.info("There are currently " + categoryCount + " incidents with a category of " + category);
}
```
(訳者)OOTBでの実行結果は下記に

```
*** Script: There are currently 4 incidents with a category of 
*** Script: There are currently 2 incidents with a category of database
*** Script: There are currently 10 incidents with a category of hardware
*** Script: There are currently 31 incidents with a category of inquiry
*** Script: There are currently 5 incidents with a category of network
*** Script: There are currently 13 incidents with a category of software
```

### Question3 ["Write operation from scope 'rhino.global' has been refused due to table's cross-scope access policy "というエラーが発生します。](https://community.servicenow.com/community?id=community_question&sys_id=c8b86a041bc66c100b8a9979b04bcb0c)

最近、スコープ付きアプリケーションのサービスポータルにアクティビティ・ストリームを追加する作業を行っています。タスクから拡張されているかどうかに関わらず、関連するすべてのテーブルにアクティビティ・ストリームを追加することができましたが、アクティビティ・ストリームに作業メモや追加コメントを投稿しようとすると、次のようなエラーが発生します。

```
"Write operation from scope 'rhino.global' has been refused due to the table's cross-scope access policy"
```

問題のテーブルが正しいアプリケーションアクセスを持っていることを再確認しました。

また、Restricted Access PrivilegeレコードとCross-scope Privilegeレコードを追加しましたが、効果はありませんでした。

複数のコミュニティの投稿によると、この構成は正しいはずなのですが、まだ同じエラーが出ています。実際、Scripts Backgroundを使ってGlobalスコープからScoped Appのテーブルに書き込もうとすると、同じエラーが出てしまいます。

このエラーに遭遇した方はいらっしゃいますか？私が何か見落としているだけだといいのですが。皆さん、ありがとうございます。

Answer(Accepted Solution):
私は時々このような障害に遭遇することがありますが、不思議なことに、このような障害は自然に解決することができるようで、悔しい思いをしています。私はいくつかの奇妙なことを発見したので、チェックする価値があるかもしれません。
クロススコープ権限の実際の記録で、3つのバーをクリックして「show latest update」を選択し、実際の更新がアプリケーションスコープ内にあることを確認してください（記録ではスコープが表示されていても、更新は別のものになっている場合があります）。もし、グローバルにある場合は、削除して再度作成する必要があるかもしれません。
時々、クロススコープのレコードを削除して作り直すと、更新が正しいスコープにあっても修正されることがあります。
また、ごくまれに、アプリをアップデートセットに公開すると、奇妙な問題が解消されることがありますが、これは事実よりも偶然だと思っています。
最後になりましたが、回避策の可能性もあります。やろうとしている操作を実行するスクリプトインクルードを自分のスコープに作成し、それをグローバルスコープから呼び出してみてはいかがでしょうか。私はこの方法で成功したことがあります。

誤った情報を提供していれば申し訳ありません。
お役に立てれば幸いです。
この記事が役に立った、または正しかった場合は、クリックすることを忘れないでください。

### Question4 :[日付選択フィールドに日数を追加する](https://community.servicenow.com/community?id=community_question&sys_id=9da27a07db6d30d0a5388263059619e9)

こんにちは。

記入日は日付フィールド、滞在日数はテキストボックス、終了日は期間から記入日を引いた日数を追加できるフィールドで、クライアントスクリプトを使って結果を終了日に入力する必要がありますか？

この点について助けてください。

Answer:
こんにちは。
クライアントスクリプトを使用して、日付フィールドに日数を追加し、別のフィールドに設定したいのですね。
日数のonChangeと入力日フィールドのonChangeを作成すれば、うまくいくはずです。

```javascript:
function onChange(control, oldValue, newValue, isLoading) {
	if (isLoading || newValue == '') {
		return;
	}

	var entryDate = g_form.getValue('entry_date');
	var daysToAdd = parseInt(g_form.getValue('days'));
	var dt = new Date(entryDate); 
	dt.setDate(dt.getDate() + daysToAdd);
	g_form.setValue('exis_date', dt.toISOString().slice(0,10));

}
```

### Question5 :[リレーションシップ・クエリ](https://community.servicenow.com/community?id=community_question&sys_id=09db4287db2db89011762183ca9619d6)
sys_userテーブルをクエリするリレーションを作成しました。
このリレーションシップにクエリを実行するときだけ、「ユーザ・クエリ」ビジネス・ルールを実行したくありません。
言い換えれば、非アクティブなユーザにもリレーションシップの値を表示したいのです。
これは可能でしょうか。
リレーションシップのスクリプトは以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/f990f903-2969-b41e-3745-48ed46e132e2.png)


### Answer
Miyuさん
エンドユーザーでテストしていますか？
ログメッセージを確認してください。


```javascript:
var url = gs.action.getGlideURI();
gs.log('AAAA: Url is :' + url);
gs.log('AAAA: Url parm : + url.indexOf('sys_user_group'));
if(url.indexOf('table_name')> -1){ // mention the table name from the page
return true;
else{
current.addActiveQuery();
}
```

Thank you!
I modified the script to the following and it worked fine!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/be2ebc9b-31ac-2c39-4248-d2b61b0b361c.png)