# 機能シンクレット

機能Thinkletは、JavaScriptを使用してカスタムデータ変換と計算を可能にします。 ビルトインのThinkletはほとんどのタスクを処理しますが、関数Thinkletは複雑なデータ操作やワークフローのロジックに柔軟性を提供します。

### 仕組み

データを変換し、洞察を生み出し、ワークフローの決定を自動化するためにJavaScriptコードをFunctionシンクレットに追加してください。 Functionは大規模な環境でもスケーラビリティが確保されるよう、バッチ実行されます。 その結果、実行は即座に開始される保証はありません。 従って、Functionシンクレットは時間に敏感な操作には使用すべきではありません。

### 使用ケース

関数Thinkletを使用するのに適したケース：

* **データ変換**: 値を変換し、データをフォーマットし、新しいメトリクスを計算します。
* **時間計算**: 時間差を求め、継続時間を追跡します。
* **意思決定の自動化**: 計算された出力を使用して、条件付きワークフローのロジックを駆動します。

### 制限

パフォーマンス、セキュリティ、および予測性を確保するために、Function thinkletは次のルールを適用します:

* Function thinkletは、安全で分離された環境で実行されます。 HTTPリクエストの送信、外部サービスやAPIへのアクセス、ワークフロー外のシステムとの連携はできません。 この制限は、実行が安全で一貫性があり、セキュリティポリシーに準拠していることを保証します。
* Function thinkletは、すべてのロジックを5秒以内に完了しなければなりません。 この時間制限を超えるスクリプトは、自動的に終了されます。 その結果、人工的な遅延を導入したり、Function thinkletを使用してワークフロー実行を一時停止することはサポートされていません。

Function thinkletは、迅速なローカルデータ処理と意思決定のためにのみ使用してください。 遅延や外部とのやり取りを伴う高度なユースケースについては、専用のthinkletの使用を検討してください。

<figure><img src="https://3549141153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeLm8O7QKZDn6z806e7Sv%2Fuploads%2Fgit-blob-a7892d877b6740221c258f8b97a4ce1845c49fc4%2FFunction-Thinklet.png?alt=media" alt=""><figcaption></figcaption></figure>

## 関数Thinkletの設定

{% hint style="info" %}
[AIで生成](#generating-javascript-with-ai-for-function-thinklets) されたJavaScriptは、Function thinkletを定義します。 最良の結果を得るには、このページの例に従ってAIプロンプトを構築してください。
{% endhint %}

生データを意味のあるフォーマットに変換することで、第三者の統合を簡素化し、例えば、2つの日付の間の日数を計算することができます。作業回避策や外部ツールを使用せずに対応可能です。

<div align="left"><figure><img src="https://3549141153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeLm8O7QKZDn6z806e7Sv%2Fuploads%2Fgit-blob-31224fecc513ff453f6f0f5275d22f02fd20bdd6%2Fimage%20(569).png?alt=media" alt="" width="375"><figcaption></figcaption></figure></div>

* **名前**: 関数Thinkletのためのユニークな名前を入力します。
* **ID**: この名前に基づいて、システムがIDを自動生成します。
* **説明 (オプション)**: Thinkletの目的とその機能について説明します。 この情報は、ワークフローの利用に慣れていない他のユーザーに役立ちます。
* **パラメータ**: **パラメータを追加**を選択し、最大5つのシンクレットパラメータを構成します。これらは関数のロジックの入力パラメータにもなります。
  * **ID**: 入力パラメーターのIDを定義します。 バリデーションロジックは、JavaScriptがサポートする文字のみを許可します。
  * **値**：対応するパラメータ値を設定します。データベース値、別のシンクレットの出力、グローバルパラメータ、またはカスタム値を使用できます。
    * 環境固有のデータを入力として使用するために、シンクレットのパラメータ値として[\[マニュアルカスタムフィールド\]](https://docs.nexthink.com/platform/ja/configuring_nexthink/configuring-your-platform/administration/content-management/custom-fields-management.md#customfieldsmanagement-choosingmanualcustomfieldtypemanual) - \`ユーザー\`または\`デバイス\`の属性を選択することができます。
* **出力**：最大5つの出力を構成するために、**出力を追加** を選択します。
  * **名前**: 望ましい出力のためのユニークな名前を入力します。
  * **ID**：名前に基づいてシステムが自動的にIDを生成します。
* **JavaScript**: 入力パラメータに基づいて関数のロジックを定義するJavaScriptコードを書いてください。 スクリプトは、定義された出力のIDを持つ出力も定義すべきです。
  * **ファンクション**シンクレットのJavaScriptを**AIで生成する**ことができます。

### Function thinkletのためのJavaScriptをAIで生成する方法

{% hint style="info" %}
システムはAI生成されたコンテンツや洞察を示すために✦スパークルアイコンを表示します。 AIは急速に進化し、素晴らしい洞察を提供していますが、まだ誤りが起こることもあります。 Nexthinkは、精度を確保し情報に基づいた意思決定をサポートするために、結果を検証することを推奨します。 詳細については、[Global AI Hub](https://docs.nexthink.com/legal/global-ai-hub)ドキュメントを参照してください。
{% endhint %}

AIでワークフロー**関数**のための**JavaScript**を生成するには：

1. **AIで生成** ボタンをクリックします。
2. 入力パラメータ、期待される出力、および必要な変換を記述した**プロンプト**リクエストを挿入します。 [プロンプトの例](#javascript-examples-for-function-thinklets-prompts-and-codes)を参照してください。
3. **説明**を確認し、生成された**コード**が論理要件を満たしていることを確認します。 論理の更新が必要な場合は、プロンプトを変更して関数を再生成してください。

AIコードジェネレーターは、JavaScriptの**コード構造と構文**に従って関数のシンクレットを生成します。

<details>

<summary>JavaScriptの<strong>コード構造と構文</strong>に関する関数シンクレット</summary>

JavaScriptが正しく動作し、デバッグが簡単になるように、これらの構文ルールに従ってください：

* `inputs.parameter_ID`を使用して、設定内でアクセス入力パラメータを定義します。
* Assign output values with the syntax `outputs.output_ID`
* Include useful information in the Workflow execution timeline for troubleshooting by using `nxLogger.log()`

```javascript
Access input parameters
const param1 = inputs.parameter_ID_1;
const param2 = inputs.parameter_ID_2;
...
const paramN = inputs.parameter_ID_5; // Up to 5 parameters
Logic for transformations
outputs.output_1 = /* your logic here */;
outputs.output_2 = /* your logic here */;
...
outputs.output_5 = /* your logic here */;
Output any results for troubleshooting
nxLogger.log("Name the output" + output_1);
```

</details>

<details>

<summary>関数シンクレットで<strong>未サポート</strong>の関数とオブジェクト</summary>

以下のグローバル関数とオブジェクトはサポートされていません：

* `setTimeout`
* `setInterval`
* `setImmediate`
* `clearTimeout`
* `clearInterval`
* `clearImmediate`
* `process`
* `require`
* `Buffer`
* `console`
* `process.nextTick`

</details>

<figure><img src="https://3549141153-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeLm8O7QKZDn6z806e7Sv%2Fuploads%2Fgit-blob-d09ee3c37dd6dbba08bb9b4d25f23e30f1945629%2Fimage%20(570).png?alt=media" alt=""><figcaption></figcaption></figure>

### シンクレットのJavaScript例：プロンプトとコード

以下は、JavaScript の AI プロンプトとコーディングの例です：

<details>

<summary>AIでJavaScriptを生成するためのプロンプトの例</summary>

\_保証終了日に基づいて、保証が終了するまでの日数を計算します。 既に期限が切れている場合は、0を出力します。

</details>

<details>

<summary>関数シンクレット内のパスワード有効期限チェックのユースケース</summary>

このコード例は、関数シンクレット内でパスワード有効期限チェックを実装する方法を示しています。

```javascript
// 入力パラメータにアクセスする
const lastUpdate = inputs.last_update_date;
 
// パスワードの有効期間を定義する（90日）
const validityDays = 90;
const expirationDate = new Date(lastUpdate);
expirationDate.setDate(expirationDate.getDate() + validityDays);
 
// 現在の日付を取得する
const now = new Date();
 
// 残り日数を計算する
const timeDiff = expirationDate - now;
const daysLeft = Math.ceil(timeDiff / (1000 * 60 * 60 * 24));
 
// 出力を設定する
outputs.days_left = daysLeft;                  // パスワード変更までの日数
outputs.if_expired = daysLeft <= 0;             // すでに切れているかどうか
 
// トラブルシューティング用の中間結果を出力する
nxLogger.log("残り日数: " + daysLeft);
nxLogger.log("通知が必要か: " + outputs.output_2);

```

</details>
