AMPscript 言語要素

AMPscript では、以下の言語要素を使用します。

  • 定数
  • 属性およびデータエクステンション
  • キーワード

定数 

AMPscript には数値定数と文字列定数を含めることができます。

数値定数値は引用符なしの数値セットで構成され、1 つの小数点と、負の値を示す先頭のマイナス記号を含むこともできます。数値定数値にコンマを含めることはできません。

1123
2
3-123
4
5123.456

文字列 (またはテキスト) 定数値では、二重引用符または単一引用符を使用する必要があります。テキスト内に 2 つの連続する区切り引用符を含めた場合、文字列定数は区切り引用符をエスケープできます。システムは代替引用符文字 (スマート引用符など) を認識しません。

1"A string value"
2
3"123.456"
4
5'a string value'
6
7'Sally''s string value'
8
9(Doubled '' will be rendered as ')

Boolean 定数値には true または false を使用する必要があります。この値は大文字と小文字を区別しません。

1true
2
3false
4
5TRUE
6
7False

属性およびデータエクステンション (カスタムオブジェクト) の値 

関数とスクリプトは、購読者属性、メール属性、およびデータエクステンションの列の値を引用符なしの文字列として参照します。属性、データエクステンションの列、テーブル、またはリレーションシップの名前にスペースまたは特殊文字が含まれる場合、その値を角括弧で囲みます。

1EmailAdr
2
3[Data Extension Attribute Name]
4
5[Total-Expense]

メール内で追加のメール属性を定義し、それを代入で使用したり、AMPscript 関数呼び出しのパラメーターとして使用したりできます。Marketing Cloud では、アカウントで追加のメール属性を使用できるようにする必要があります。ご質問がある場合は、Marketing Cloud のリレーションシップマネージャーにお問い合わせください。

キーワード 

スクリプト内で変数の宣言、初期化、変更を行います。これで、スクリプトのステートメントと関数で変数を参照できます。

変数宣言は、キーワード VAR と、それに続く 1 つ以上のコンマ区切りの変数名で構成されます。変数名は「@」で始まり、1 つ以上の他の文字、数字、またはアンダースコアを含む必要があります。変数名にスペースとコンマは使用できません。

1@Name
2
3@C1

変数割り当ては、キーワード SET と、それに続く変数名、等号、および値で構成されます。

  • 宣言 - VAR @variable
  • 設定 - SET <変数>=<定数関数または属性>

VAR キーワードを使用して変数を宣言すると、エントリが変数ディクショナリに追加され、変数名がキー、NULL が値として設定されます。同じ名前のエントリがすでに存在する場合、変数の値は NULL に設定されます。変数を使用して FOR ループを制御する場合、その変数を宣言すると、検証エラーまたはランタイムエラーが発生します。

1%%[VAR @Count]%%
2
3%%[VAR @Count1, @Count2, @Count3]%%
4Using Conditions Syntax

簡単な比較では次の構文を使用します。

1<variable, attribute><simple operator><variable, attribute, function, constant>

比較演算子で値を比較します。次の演算子は、大文字と小文字を区別しません。

  • == Is equal to (次の値と等しい)
  • != Is not equal to (次の値と一致しない)
  • > Greater than (次の値より大きい)
  • < Less Than (次の値未満)
  • >= Greater than or equal to (次の値以上)
  • <= Less than or equal to (次の値以下)

複数の条件を組み合わせるには、結合演算子を使用します。

  • AND - 両方の条件が true である必要があります。
  • OR - どちらかの条件が true である必要があります。

NOT 演算子は Boolean 式の結果を逆にします。

  • NOT - Boolean 式の結果を逆にします。

式の評価を制御するには、括弧を使用します。

1(BooleanExpression AND BooleanExpression) OR (BooleanExpression AND BooleanExpression)

IF 構文の使用 

1if < condition > then < statement >
2    elseif < condition > then < statement>
3      .
4    else < statement>
5endif

ステートメント 

  • IF - IF ステートメントを使用して、条件付き処理を実行します。
  • ELSEIF - ELSEIF ステートメントを使用して、条件付き処理を実行します。IF ブロック内に複数の ELSEIF ステートメントを含めることができます。
  • ELSE - ELSE ステートメントを使用して、条件付き処理を実行します。IF ブロック内には 1 つの ELSE ステートメントのみを含めることができます。
  • ENDIF - ENDIF ステートメントを使用して、IF ブロックを終了します。IF ブロックの最後に 1 つの ENDIF ステートメントのみを含める必要があります。

IF 条件の評価の使用 

IF ステートメントを使用すると、含まれる論理式に応じて、IF ブロック内の任意のコンテンツを条件付きで実行できます。IF ステートメントは IF ステートメント内でネストできます。

1%%[IF expression1 <comparison operator> expression2 THEN]%%
2    [wrapped script or email content]
3%%[ELSEIF expression1 <comparison operator> expression3 THEN]%%
4    [wrapped script or email content]
5%%[ELSE]%%
6    [wrapped script or email content]
7%%[ENDIF]%%
8The optional ELSEIF statement can repeat as desired to evaluate additional conditions.

ELSE ステートメント (省略可能) を IF とすべての ELSEIF ステートメントの後、および ENDIF の前に 1 回のみ含めて、前のどの条件も True に評価されない場合のデフォルト動作を定義します。

IF または ELSEIF ステートメントでは、複数の条件を使用できます。これらの条件を AND または OR キーワードで結合し、括弧でグループ化して、評価の順序を制御します。評価を逆にするには、NOT キーワードを使用できます。

1IF expression1 <comparison operator> expression2
2        AND [NOT] (expression3 <comparison operator> expression4
3        OR expression3 <comparison operator> expression5)
4THEN .

式には次のいずれかの入力種別を含めることができます。

  • 定数
  • 変数
  • 属性およびデータエクステンションの値
  • 関数呼び出し

呼び出しに比較演算子と 2 番目の式が含まれない場合、このシステムは、比較値 True との equal (次の値と等しい) 演算子を想定します。

1IF NOT EMPTY(expression1) THEN

この例は、値のある変数を含めて、値がない場合はその変数を除外する方法を示しています。

1%%[if not empty(MailingAddress) then]%%
2%%MailingAddress%%
3%%[endif]%%

FOR プロセスループの使用 

FOR ステートメントを使用すると、FOR ブロック内のコンテンツを複数回反復できます (回数は可変)。

1%%[FOR @Variable = <start expression> TO|DOWNTO <end expression> DO ]%%
2        [wrapped script or email content]
3    %%[NEXT @Variable]%%

プロセスループ内で @Variable 変数の変更はロックされます。

開始と終了のインデックス式には、整数に評価される次の 4 つの入力種別のいずれかを使用できます。

  1. 数値定数
  2. 属性またはデータエクステンションの値
  3. 変数
  4. LookupRows() などの関数呼び出し

TO または DOWNTO キーワードは、FOR ループの反復のたびに変数の値を 1 ずつ増やすか、減らすかを決定します。変数値は、ループの各反復の最後で設定されるか、1 ずつ増えます。終了インデックス式がカウンター変数の新しい値と比較されます。値がまだ終了値に達していない、または終了値と等しくない場合、ループは続行します。

NEXT ステートメントでは FOR ループが終了します。必要に応じて、ループを制御する変数名を使用してステートメントに続けます。

SET ステートメントの使用 

SET ステートメントを使用して、変数に値を割り当てます。SET ステートメントを使用して、1 つの変数のみを初期化します。FOR ループのカウンターで使用されている変数を設定すると、検証エラーまたはランタイムエラーが発生します。変数は、割り当てられた値の種別を引き継ぎます。

1%%[
2VAR @Count, @Count2
3SET @Count = 0
4SET @Count2 = 100
5]%%
6@Name
7@C1

Output および OutputLine キーワードの使用 

キーワード Output および OutputLine は、コードブロック内で実行されたコードの結果を返し、表示されたコンテンツに結果を含めます。OutputLine キーワードは、解決したコンテンツの末尾に行頭復帰/改行 (CRLF) も付加します。Output および OutputLine は、ネストされた関数またはスクリプトブロックの結果を操作します。が、直接リテラルの受け渡しをサポートしません。

次のコードについて考えてみます。

1%%[Output(Now())]%%

システムは現在の日時を出力します。OutputLine キーワードは、末尾に CRLF を付加した同じ情報を返します。

次のコードについて考えてみます。

1%%[ Var @text
2Set @text = "Example Text"
3Output(v(@text)) ]%%
4The system prints "Example Text," as that text is the value of the variable @text.

次の例のコードは機能しません。

1%%[ Var @text
2Set @text = "Example Text"
3Output(@text) ]%%

上記のコード例は、Output が直接リテラルの受け渡しをサポートしないため、機能しません。

以下の関数について考えます。

1%%[ OutputLine(Substring("Example Text",1,6)) ]%%

示されている Substring() 関数はテキスト内の最初の文字から 6 文字を返すため、システムは「Exampl」を出力し、結果の末尾に CRLF を付加します。

コメントの使用 

AMPscript には、作成者がコードについて説明するためのコメントや実行されないメモを含めることができます。コメントを開くには「/*」シーケンスを使用し、コメントを閉じるには「*/」シーケンスを使用する必要があります。コメントは複数の行にまたがることができます。

1%%[ /* Insert Comment Here */ ]%%

エンタープライズの意識での AMPscript 言語要素の使用 

以下の AMPscript 関数には、エンタープライズの意識が含まれます。

  • LookupRows()
  • Lookup()
  • LookupOrderedRows()

これらの関数で「ENT.」プレフィックスを使用すると、稼働しているデータエクステンションが親のエンタープライズレベルに存在することをシステムに示すことができます。

次の例では、エンタープライズ管理者レベルで保存されている MERCHANT データエクステンションのデータを検索します。

1%%[
2Var @rows
3Set @rows = LookupRows("Ent.Merchants","TRAVELWEB_MERCHANT_ID",200043800)
4]%%<br>
5%%=Field(Row(@rows,1),"merchant_name")=%%<br><br>

行セット 

行セットには、データの 1 つ以上のコレクションが行として含まれます。これは Row() 関数で処理されます。各行には、個々のデータポイントがフィールドとして含まれます。これは Field() 関数で処理されます。AMPscript では、v() などの関数を使用して行セットのデータに直接アクセスできませんFOR ループ内などでさらに処理を行う場合は、その前に Empty() または IsNull() を使用して行セットにデータが含まれることを確認してください。

行セットにデータが含まれない場合、Empty() 関数と IsNull() 関数はいずれも false を返します。

行 (0-x) の数を確認するには、Rowcount() 関数のみを使用します。