開発者向け機能:サーバスクリプト:context
## 概要
[サーバスクリプト](/ja/manual/table-management-server-script)でユーザID、サイトIDなどの、ユーザ要求に関する情報を参照する際に使用します。また、スクリプト間のデータ共有、ログ出力、メッセージ出力に使用します。
## プロパティ
|No|Name|Get|Set|Type|Description|
|:----|:----|:----|:----|:----|:----|
|1|[UserData](/manual/server-script-context-user-data)|〇|〇|ExpandoObject|スクリプト間でデータの共有が可能|
|2|[QueryStrings](/manual/server-script-context-query-strings)|〇|-|Object|URLのクエリパラメータの値を取得可能|
|3|[Forms](/manual/server-script-context-forms)|○|-|Forms|フォームの情報を取得可能|
|4|FormStringRaw|○|-|string|フォーム(項目)に入力した情報|
|5|FormString|○|-|string|フォーム(項目)に入力した情報|
|6|Ajax|○|-|bool|Ajaxでリクエストしたかどうかのフラグ|
|7|Mobile|○|-|bool|Mobileでリクエストしたかどうかのフラグ|
|8|ApplicationPath|○|-|string|アプリケーションパス|
|9|AbsoluteUri|○|-|string|絶対URI|
|10|AbsolutePath|○|-|string|絶対パス|
|11|Url|○|-|string|URL|
|12|UrlReferrer|○|-|string|前回要求したURL|
|13|Controller|○|-|string|コントローラ名|
|14|Query|○|-|string|URLクエリパラメータ|
|15|Action|○|-|string|アクション名|
|16|TenantId|○|-|int|テナントID|
|17|SiteId|○|-|long|サイトID|
|18|Id|○|-|long|レコードID|
|19|Groups|○|-|IEnumerable<int>|所属するグループのグループIDのコレクション|
|20|TenantTitle|○|-|string|テナントのタイトル|
|21|SiteTitle|○|-|string|サイトのタイトル|
|22|RecordTitle|○|-|string|レコードのタイトル|
|23|DeptId|○|-|int|組織ID|
|24|UserId|○|-|int|ユーザID|
|25|LoginId|○|-|string|ログインID|
|26|Language|○|-|string|設定言語|
|27|TimeZoneInfo|○|-|string|タイムゾーン|
|28|HasPrivilege|○|-|bool|操作しているユーザが特権ユーザかどうかのフラグ|
|29|ApiVersion|○|-|decimal|APIのバージョン|
|30|ApiRequestBody|○|-|string|APIのリクエスト内容|
|31|RequestDataString|○|-|string|リクエストデータ|
|32|ContentType|○|-|string|レスポンスヘッダの種類|
|33|ServerScript.ScriptDepth|○|-|int|サーバスクリプトが実行された回数|
|34|ControlId|○|-|string|要求元コントロールのID|
|35|Condition|○|-|string|サーバースクリプトの条件の名称|
|36|ReferenceType|○|-|string|テーブル種別。記録テーブルの場合'Results'、期限付きテーブルの場合'Issues'を返却|
|37|HttpMethod|○|-|string|リクエストのHTTP Method|
## メソッド
|No|Name|Description|
|:----|:----|:----|
|1|[AddMessage](/manual/server-script-context-add-message)|ブラウザの画面下部にメッセージを出力します。|
|2|[Error](/manual/server-script-context-error)|ユーザが要求した作成、更新、削除の操作をキャンセルし、エラーメッセージを出力します。|
|3|[Log](/manual/server-script-context-log)|ブラウザのコンソールにログを出力します。|
|4|[Redirect](/manual/server-script-context-redirect)|ブラウザにページ遷移を実行させます。|
|5|[AddResponse](/manual/server-script-context-add-response)|任意のクライアントレスポンスを返却します。|
|6|[ResponseSet](/manual/server-script-context-response-set)|フォームに情報を格納します。|
## 使用例①
下記の例では、ログインユーザのユーザIDが1以外の場合には、作成者が自分自身のレコードのみ表示するようフィルタします。条件は「ビュー処理時」にチェックします。
##### JavaScript
```
if (context.UserId !== 1) {
view.Filters.Creator = context.UserId;
}
```
## 使用例②
下記の例では、ログインユーザの所属する全てのグループのグループIDをログに出力します。
##### JavaScript
```
for (let groupId of context.Groups){
context.Log(groupId);
}
```
## 使用例③
下記の例では、条件:更新後に設定した場合に初回更新後のみClassAに1234を入力し再度更新します。
##### JavaScript
```
// 無限に更新を繰り返すためcontext.ServerScript.ScriptDepthで実行回数をチェックする
if(context.ServerScript.ScriptDepth === 0){
model.ClassA = '1234';
model.UpdateOnExit = true;
}
```
## サンプルコード
##### コード内の【 ... 】 は適宜修正してください。
<details>
<summary>1. 任意のプロセス実行時にサーバスクリプトを起動する</summary>
context.ControlIdで、実行されたプロセスを判定し、任意のサーバスクリプト処理を実行します。
##### JavaScript
```
function itemsUpsert() {
// サイト名を指定
const siteName = '【サイト名】';
// サイト情報を取得
const site = items.GetClosestSite(siteName);
if (!site) {
logs.LogInfo(`${siteName} サイト情報取得失敗`);
return false;
}
// 1対1同期のための「外部キー」
// ※転記元レコード(ResultId)を転記先テーブルの ClassB に保存し、UpsertのKeysに指定する
const sourceId = model.ResultId;
// リクエストを生成
const data = {
Keys: ['ClassB'], // 外部キー項目(この値で更新/新規を判定)
Title: model.Title,
Status: model.Status,
ClassHash: {
ClassA: model.ClassA,
ClassB: sourceId, // 外部キー(転記元ID)
},
};
// レコードを作成/更新
const result = items.Upsert(site.SiteId, JSON.stringify(data));
if (result) {
logs.LogInfo(`Upsert成功(外部キー=${sourceId})`);
} else {
logs.LogUserError(`Upsert失敗(外部キー=${sourceId})`);
}
}
logs.LogInfo(`ControlId=${context.ControlId}`);
switch (context.ControlId) {
// ControlIdで実行されたプロセスを判断
case 'Process_1':
// プロセスID:1の処理
itemsUpsert();
break;
default:
// 何もしない
break;
}
```
##### 実行結果
```
(Info):ControlId=Process_1
(Info):Upsert成功(外部キー=9999)
```
</details>
<details>
<summary>2. ログインユーザの属性による画面項目制御</summary>
ログインユーザの属性(context.HasPrivilege、context.Groupsで判定)と、状況により画面項目の制御(columns.ReadOnly,Hideで制御)を行います。サンプルコードでは以下のような仕様で実装しています。
<table class="matrix">
<caption>制御パターン判定</caption>
<thead>
<tr>
<th>ユーザ種類</th>
<th>状況</th>
<th>制御パターン</th>
</tr>
</thead>
<tbody>
<tr>
<td>特権ユーザ</td>
<td>-</td>
<td>パターンA</td>
</tr>
<tr>
<td>管理者グループ所属ユーザ(ID1,2)</td>
<td>-</td>
<td>パターンB</td>
</tr>
<tr>
<td rowspan="2">上記以外のユーザ</td>
<td>完了(900) or 保留(910)</td>
<td>パターンC</td>
</tr>
<tr>
<td>以外</td>
<td>パターンD</td>
</tr>
</tbody>
</table>
<table class="matrix">
<caption>画面項目制御</caption>
<thead>
<tr>
<th colspan="2">画面項目</th>
<th>パターンA</th>
<th>パターンB</th>
<th>パターンC</th>
<th>パターンD</th>
</tr>
</thead>
<tbody>
<tr>
<tr>
<td>タイトル</td><td>Title</td>
<td>編集可</td><td>編集可</td><td>読取専用</td><td>編集可</td>
</tr>
<tr>
<td>内容</td><td>Body</td>
<td>編集可</td><td>編集可</td><td>読取専用</td><td>編集可</td>
</tr>
<tr>
<td>状況</td><td>Status</td>
<td>編集可</td><td>編集可</td><td>読取専用</td><td>編集可</td>
</tr>
<tr>
<td>分類A</td><td>ClassA</td>
<td>編集可</td><td>編集可</td><td>読取専用</td><td>編集可</td>
</tr>
<tr>
<td>分類B</td><td>ClassB</td>
<td>編集可</td><td>読取専用</td><td>非表示</td><td>非表示</td>
</tr>
<tr>
<td>日付A</td><td>DateA</td>
<td>編集可</td><td>読取専用</td><td>読取専用</td><td>編集可</td>
</tr>
<tr>
<td>説明A</td><td>DescriptionA</td>
<td>編集可</td><td>編集可</td><td>非表示</td><td>非表示</td>
</tr>
</tbody>
</table>
##### JavaScript
条件:画面表示の前
```javascript
// 設定
const ADMIN_GROUP_IDS = new Set([1, 2]);
const STATUS_PATTERN_C = new Set([900, 910]); // 完了/保留
const PATTERN_RULES = {
// パターンA: 何もしない(全編集可)
A: [],
// パターンB: ClassB, DateA を読取専用
B: [
['ClassB', 'ReadOnly'],
['DateA', 'ReadOnly'],
],
// パターンC: タイトル/内容/状況/分類A/日付Aは読取専用、ClassB/説明Aは非表示
C: [
['Title', 'ReadOnly'],
['Body', 'ReadOnly'],
['Status', 'ReadOnly'],
['ClassA', 'ReadOnly'],
['DateA', 'ReadOnly'],
['ClassB', 'Hide'],
['DescriptionA', 'Hide'],
],
// パターンD: ClassB, DescriptionA を非表示
D: [
['ClassB', 'Hide'],
['DescriptionA', 'Hide'],
],
};
const DEBUG = true;
// 判定(業務ルール)
function decidePattern() {
if (context.HasPrivilege) return 'A';
// context.Groups は Iterable のため Set化して判定をシンプルに
const userGroupIds = new Set(context.Groups);
const isAdminGroupUser = [...ADMIN_GROUP_IDS].some((id) =>
userGroupIds.has(id)
);
if (isAdminGroupUser) return 'B';
// 上記以外のユーザ
return STATUS_PATTERN_C.has(model.Status) ? 'D' : 'C';
}
// 適用(UI制御)
function applyPattern(pattern) {
const rules = PATTERN_RULES[pattern] ?? [];
for (const [columnName, control] of rules) {
// サンプルとして:列が存在しない場合も落とさずスキップ
if (!columns[columnName]) continue;
columns[columnName][control] = true;
}
}
// 実行
const pattern = decidePattern();
if (DEBUG) context.Log(`pattern=${pattern}`);
applyPattern(pattern);
```
##### 実行結果
```
(Info):pattern=C
```
</details>
## 対応バージョン
|対応バージョン|内容|
|:--|:--|
|1.4.17.0 以降| サーバスクリプトにcontext.ReferenceTypeプロパティを追加 |
|1.4.17.0 以降| サーバスクリプトにcontext.HttpMethodプロパティを追加 |
## 関連情報
<div id="ManualList"><ul><li><a href="/ja/manual/table-management-server-script">テーブルの管理:サーバスクリプト</a><span>2026/02/10 up</span></li></ul></article>
<ul><li><a href="/ja/manual/server-script">開発者向け機能:サーバスクリプト</a><span>2025/11/27 up</span></li>
<li><a href="/ja/manual/server-script-context-add-message">開発者向け機能:サーバスクリプト:context.AddMessage</a><span>2023/06/21 up</span></li>
<li><a href="/ja/manual/server-script-context-add-response">開発者向け機能:サーバスクリプト:context.AddResponse</a><span>2026/02/02 up</span></li>
<li><a href="/ja/manual/server-script-context-error">開発者向け機能:サーバスクリプト:context.Error</a><span>2023/06/21 up</span></li>
<li><a href="/ja/manual/server-script-context-forms">開発者向け機能:サーバスクリプト:context.Forms</a><span>2025/01/30 up</span></li>
<li><a href="/ja/manual/server-script-context-log">開発者向け機能:サーバスクリプト:context.Log</a><span>2023/06/21 up</span></li>
<li><a href="/ja/manual/server-script-context-query-strings">開発者向け機能:サーバスクリプト:context.QueryStrings</a><span>2026/01/26 up</span></li>
<li><a href="/ja/manual/server-script-context-redirect">開発者向け機能:サーバスクリプト:context.Redirect</a><span>2025/01/30 up</span></li>
<li><a href="/ja/manual/server-script-context-response-set">開発者向け機能:サーバスクリプト:context.ResponseSet</a><span>2023/06/21 up</span></li>
<li><a href="/ja/manual/server-script-context-user-data">開発者向け機能:サーバスクリプト:context.UserData</a><span>2026/01/26 up</span></li></ul></article></div><input id="SearchTextHidden" type="hidden" value="" />



