Marketing Cloud のプログラミング言語 : サーバーサイド JavaScript について


+ [サーバーサイド JavaScript について](https://trailhead.salesforce.com/ja/content/learn/modules/marketing-cloud-programmatic-languages/learn-about-server-side-javascript)
+ [サーバーサイド JavaScript](https://developer.salesforce.com/docs/marketing/ja-jp/marketing-cloud/guide/ssjs_serverSideJavaScript.html)

[【未解決】SSJS クエリの外部キーを使用して Synchronized Data Extension から行をフェッチしようとしています。しかし、それは機能しません。Sync DE で SSJS クエリを実行する方法を教えてください。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007RI7jk)

Marketing Cloud には AMPscript にまとめられたプログラミング言語がありますが、時としてプラットフォームとやりとりするまったく新しい方法を学ぶのが煩わしいことがあります。開発者がすぐ着手できるように、Marketing Cloud にはサーバーサイド JavaScript (SSJS) も用意されています。この構文と形式は Web 開発者にとって見慣れたものですが、Marketing Cloud ではこの言語が特に Marketing Cloud のアクティビティで機能するようにカスタマイズされています。

これらの関数によって Marketing Cloud のアクティビティにアクセスできるだけでなく、AMPscript には存在しない機能も使用できるようになります。

+ SSJS では配列を使用できます。
+ SSJS では EVAL 関数を使用できます。
+ SSJS は、try catch ブロックなど、高度な例外を処理します。

サーバーサイド JavaScript は DOM とは連携せず、外部のライブラリでは機能しません。代わりに、Marketing Cloud が提供するライブラリを使用して、サーバーサイド JavaScript を作成します。配列、算術関数、EVAL 関数、try/catch ブロックなど、JavaScript のすべてのネイティブ関数はサーバーサイド JavaScript と連携します。

# AMPscript とサーバーサイド JavaScript 

AMPscript または Platform オブジェクトのサーバーサイド JavaScript 関数をメールメッセージ内で排他的に使用し、ランディングページおよびアプリケーションに対してコアライブラリのサーバーサイド JavaScript の使用を予約する必要があります。

その後、どちらの言語を使用するかの選択には、いくつかの要因が影響する可能性があります。

AMPscript は、インラインパーソナライズまたは単純な IF ELSE ステートメントを簡単かつ効率的に処理できます。
各購読者に独自のコンテンツを表示する必要がある事例を AMPscript はサーバーサイド JavaScript よりも適切に処理できます。

一般に、スクリプト言語を初めて使用するユーザーの場合、サーバーサイド JavaScript よりも短い時間で AMPscript を習得できます。
JavaScript の知識を持つユーザーは、その知識を Marketing Cloud アプリケーションにすぐに適用できます。

一般に、大半のユーザーが AMPscript を使用して、実行する必要があるタスクを処理できます。最終的には、可能な最も洗練された効率的な方法でタスクを完了するのに役立つ言語の決定には、多くの要因が役立ちますが、情報に基づくより適切な意思決定を行うには、上記の要因が役立つ可能性があります。使用する言語について質問がある場合は、Marketing Cloud アカウント担当者にお問い合わせください。


# SSJS ライブラリー

SSJS には 2 種類のライブラリーがあり、両者には重複している部分があります。どちらも標準の JSON と JavaScript 機能を使用できるようにするものですが、使用する状況が異なります。どちらを使用すればよいのかはどうすればわかるのでしょうか? この質問の答えは簡単です。

+ SSJS をメールや SMS メッセージに含める場合は、プラットフォームライブラリーを使用します。
+ ランディングページやアプリケーションを構築している場合は、コアライブラリーを使用します。


プラットフォームの関数は AMPscript の関数とよく似ていますが、常に先頭に Platform というプレフィックスが付きます。それ以外は、AMPscript と同様のタスクを実行できます。

+ アカウント情報を取得または変更する。
+ アカウントユーザーとやりとりする。
+ コンテンツ領域を操作する。
+ データエクステンション情報を追加、取得、削除、更新する。
+ 日時関数を実行する。
+ メールメッセージやトリガーによる送信を作成して送信する。
+ 購読者情報を作成、取得、更新、削除する。
+ HTTP の関数や情報を操作する。
+ 各種のユーティリティ関数や評価関数を使用する。


SSJS は次のメソッドもサポートしています。

|メソッド名|機能|
|:---------|:--------------|
|追加|API オブジェクトで SOAP API の作成メソッドを呼び出します。|
|削除|API オブジェクトで SOAP API の削除メソッドを呼び出します。|
|更新|API オブジェクトで SOAP API の更新メソッドを呼び出します。|
|取得|API オブジェクトで SOAP API の取得メソッドを呼び出します。|


# サーバーサイド JavaScript の使用方法 

サーバーサイド JavaScript は、Platform クラスとコアライブラリを介して Marketing Cloud とやり取りします。このライブラリと連携するようにコードを記述し、Marketing Cloud アカウント内の情報と連携します。このライブラリを使用すると、以前のバージョンを維持したままサーバーサイド JavaScript を更新できるため、既存のコードが破損しません。サーバーサイド JavaScript サービスの一環として JavaScript 仕様で説明されているすべてのコマンドと構文を使用できます。

# The SSJS Coding Guide

+ [The SSJS Coding Guide](https://joernberkefeld.github.io/SFMC-Cookbook/ssjs/)

### 1.1. スタイルガイドライン

適切なヒントを取得するには、ESLint を「eslint:recommended」に設定し、「extends」設定属性で「google」を設定し、parserOptions.ecmaVersion を 3 に設定します。そこから、すべてのグローバル (SSJS がグローバルに公開するオブジェクト/クラス) を追加する必要があります。スコープ)、これでほぼ完了です。完全なセットアップについては、添付の構成を参照してください。一般に、[公式の Angular.js 1.0 ガイド](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md)に従うと、優れた SSJS コードも作成されます。

一般的なセットアップのためにこれらをダウンロードします。
+ [.eslintrc](https://github.com/JoernBerkefeld/SFMC-Cookbook/blob/master/.eslintrc)
+ [.prettierrc](https://github.com/JoernBerkefeld/SFMC-Cookbook/blob/master/.prettierrc)
+ [.editorconfig](https://github.com/JoernBerkefeld/SFMC-Cookbook/blob/master/.editorconfig)
+ [パッケージ.json](https://github.com/JoernBerkefeld/SFMC-Cookbook/blob/master/package.json)

Visual Studio Code を使用する場合は、次のようにします (プロジェクト フォルダーのルート内に .vscode フォルダーを配置します)。

+ [推奨される VSC 拡張機能](https://github.com/JoernBerkefeld/SFMC-Cookbook/blob/master/.vscode/extensions.json)
+ [推奨される VSC 設定](https://github.com/JoernBerkefeld/SFMC-Cookbook/blob/master/.vscode/settings.json)

### 1.2. SSJS スニペット

#### 1.2.1. GETパラメータの読み取り
Platform.Request.RequestURLすべての GET パラメータを取得するには、これらのパラメータを含む完全な URL を保持するを解析できます。

```
<script runat="server">
Platform.Load("core", "1.1.1");

var queryParams = {};
var pageUrl = Platform.Request.RequestURL;
var helper = pageUrl.split("?");

if(helper.length == 2) {
    var queryArr = helper[1].split('&');
    for(var i=0; i<queryArr.length; i++) {
        var keyVal = queryArr[i].split('=');
        queryParams[keyVal[0]] = keyVal[1];
    }
}

// queryParams should now be an object holding the query parameters with parameter name as keys
</script>
```

読み取りたいパラメータがすでにわかっている場合は、次のようにして直接アクセスできますPlatform.Request.GetQueryStringParameter()。

```
<!-- GET url.com/cloudpage?data=test -->
<script runat="server">
Platform.Load("core", "1.1.1");

var param = Platform.Request.GetQueryStringParameter("data");
// param now has the value "test"
</script>
```

Platform.注:の前のを省略しても機能します。Request.

#### 1.2.2. POSTフォームパラメータの読み取り
これは、いくつかの値だけを読み取りたい場合のショートカットです。以下は、すべてのフォーム値を一度に取得するオプションです。

```
<!-- GET url.com/cloudpage with form field "firstname" -->
<script runat="server">
Platform.Load("core", "1.1.1");

var param = Platform.Request.GetFormField("firstname");
// param no
```

#### 1.2.3. POSTペイロードの読み取り

```
<!-- POST url.com/cloudpage -->
<script runat="server">
Platform.Load("core", "1.1.1");

var postBody = Platform.Request.GetPostData();
</script>
```

注:このメソッドは、最初に呼び出したときにのみ機能します。次回の実行では何も返されません。複数回必要な場合は、応答を変数に保存します。

戻り値はヘッダーによって異なります。ペイロードとヘッダーの組み合わせによっては、すぐに 500 エラーが発生するものもありますが、他のものは正常に動作します。

#### 許可されるコンテンツ タイプ:

|ヘッダ	|サンプルペイロード	|サンプル返却	|コメント|
|:-------|:-----------------|:--------------|:---------|
|application/x-www-form-urlencoded	|firstname=John&lastname=Smith	|firstname=John&lastname=Smith	|これは通常のフォームフィールドに使用されます|
|application/json/ application/xml/ |text/xml/text/plain	whatever you like; JSON 値を指定すると、後でその値として解析できるようになります	|whatever you like||


```
<!-- enhanced wrapper to deal with post data -->
<!-- post body: {"attribute1": "test", "foo":"bar"} -->

<script runat="server">
Platform.Load("core", "1.1.1");

function PostBody() {
    var postBody = null;
    var service = {
        json: json,
        form: form,
        text: text
    };

    // init
    _init();

    return service;

    function _init() {
        postBody = Platform.Request.GetPostData();
    }

    function text() {
        return postBody;
    }
    function json() {
        var temp = Platform.Function.ParseJSON(postBody);
        if (!temp && postBody) {
            temp = {error: "input was no string and not JSON formatted"};
        }
        return temp;
    }
    function form() {
        var obj = {};
        var tempArr = postBody.split("&");
        for (var i = 0; i < tempArr.length; i++) {
            var temp = tempArr[i].split("=");
            if(temp.lengh>1) {
                obj[temp[0]] = temp[1];
            }
        }
        return obj;
    }
}

// demo on how to use it
var myPostBody = PostBody();
Write(myPostBody.text() + "\n");
// {"attribute1": "test", "foo":"bar"}

var json = myPostBody.json();
for (var el in json) {
    Write(el + ": " + json[el] + "\n");
    // attribute1: test
    // foo: bar
}

var form = myPostBody.form();
for (var el in form) {
    Write(el + ": " + form[el] + "\n");
    // attribute1: test
    // foo: bar
}

</script>
```