工作流程中的 JavaScript 程式碼範例 javascript-in-workflows

這些範例說明如何在工作流程中使用JavaScript程式碼:

深入瞭解靜態和非靜態SOAP方法。

在這些範例中,會使用ECMAScript for XML (E4X)擴充功能。 透過此擴充功能,您可以在相同指令碼中合併JavaScript呼叫和XML原始專案。

若要嘗試這些範例,請依照下列步驟進行:

  1. 建立工作流程並將這些活動新增至工作流程:

    1. 開始活動
    2. JavaScript程式碼活動
    3. 結束活動

    進一步瞭解建置工作流程。

  2. 將JavaScript程式碼新增至活動。 了解更多

  3. 儲存工作流程。

  4. 測試範例:

    1. 啟動工作流程。 了解更多
    2. 開啟日誌。 了解更多

範例1:寫入資料庫 write-example

若要寫入資料庫,您可以在xtk:session結構描述上使用靜態Write方法:

  1. 以XML撰寫寫入要求。

  2. 寫入記錄:

    1. 呼叫xtk:session結構描述上的Write方法。

      note important
      IMPORTANT
      如果您使用Adobe Campaign v8,建議您針對Snowflake表格中的Write方法,搭配​ 擷取 ​和​ 資料更新/刪除 API使用預備機制。 深入了解.
    2. 傳遞XML程式碼作為寫入要求的引數。

步驟1:撰寫寫入要求

您可以新增、更新和刪除記錄。

插入記錄

由於insert作業是預設作業,因此您不需要指定它。

將此資訊指定為XML屬性:

  • 要修改之資料表的綱要
  • 要填入的表格欄位

例如:

var myXML = <recipient xtkschema="nms:recipient"
    firstName="Isabel"
    lastName="Garcia"
    email="isabel.garcia@mycompany.com"/>

更新記錄

使用_update作業。

將此資訊指定為XML屬性:

  • 要修改之資料表的綱要
  • 要更新的表格欄位
  • 識別要更新的記錄所需的索引鍵引數

例如:

var myXML = <recipient xtkschema="nms:recipient"
    status="Client"
    email="isabel.garcia@mycompany.com"
    operation="_update"
    _key="@email"/>

刪除記錄

使用DeleteCollection方法。 了解更多

指定此資訊:

  • 要修改之資料表的綱要
  • 以XML元素的形式識別要更新的記錄所需的where子句

例如:

xtk.session.DeleteCollection(
    "nms:recipient",
    <where>
        <condition expr="[@email] = 'isabel.garcia@mycompany.com'"/>
    </where>,
    false
    )

步驟2:寫入記錄

呼叫xtk:session結構描述上的非靜態Write方法:

xtk.session.Write(myXML)

此方法不會傳回任何值。

將完整程式碼新增至工作流程中的JavaScript程式碼活動:

var myXML = <recipient xtkschema="nms:recipient"
    firstName="Isabel"
    lastName="Garcia"
    email="isabel.garcia@mycompany.com"/>

xtk.session.Write(myXML)

此影片說明如何寫入資料庫:

範例2:查詢資料庫 read-example

若要查詢資料庫,您可以使用非靜態xtk:queryDef執行個體方法:

  1. 以XML撰寫查詢。
  2. 建立查詢物件。
  3. 執行查詢。

步驟1:撰寫查詢

指定queryDef實體的XML程式碼。

語法:

<queryDef schema="nms:recipient" operation="">
    <!-- select, where, and orderBy clauses as XML elements -->
</queryDef>

指定此資訊:

  • 要讀取之資料表的綱要
  • 作業
  • select子句中要傳回的資料行
  • where子句中的條件
  • orderBy子句中的篩選准則

您可以使用下列操作:

作業
結果
select
零個或多個元素會傳回為集合。
getIfExists
傳回一個元素。 如果不存在相符元素,則會傳回空白元素。
get
傳回一個元素。 如果不存在相符元素,則會傳回錯誤。
count
以具有count屬性的元素形式傳回的相符記錄數目。

selectwhereorderBy子句寫入為XML專案:

  • select子句

    指定要傳回的欄。 例如,若要選取人員的名字和姓氏,請撰寫此程式碼:

    code language-xml
    <select>
        <node expr="@firstName"/>
        <node expr="@lastName"/>
    </select>
    

    使用nms:recipient結構描述時,元素會以下列形式傳回:

    code language-xml
    <recipient firstName="Bo" lastName="Didley"/>
    
  • where子句

    若要指定條件,請使用where子句。 例如,若要選取位於​ Training ​資料夾中的記錄,您可以撰寫此程式碼:

    code language-xml
    <where>
        <condition expr="[folder/@label]='Training'"/>
    </where>
    

    合併多個運算式時,請在第一個運算式中使用布林運運算元。 例如,若要選取所有名為Isabel Garcia的人,您可以撰寫此程式碼:

    code language-xml
    <condition boolOperator="AND" expr="@firstName='Isabel'"/>
    <condition expr="@lastName='Garcia'"/>
    
  • orderBy子句

    若要排序結果集,請將orderBy子句指定為具有sortDesc屬性的XML專案。 例如,若要以遞增順序排序姓氏,您可以編寫此程式碼:

    code language-xml
    <orderBy>
        <node expr="@lastName> sortDesc="false"/>
    </orderBy>
    

步驟2:建立查詢物件

若要從XML程式碼建立實體,請使用create(content)方法:

var query = xtk.queryDef.create(
    <queryDef schema="nms:recipient" operation="select">
    …
    </queryDef>)

create(content)方法加上要建立之實體的結構描述。

content ​引數為字串引數,是選用專案。 此引數包含描述實體的XML程式碼。

步驟3:執行查詢

請依照下列步驟操作:

  1. 呼叫queryDef實體上的ExecuteQuery方法:

    code language-javascript
    var res = query.ExecuteQuery()
    
  2. 處理結果:

    1. 使用回圈建構反複處理select作業的結果。
    2. 使用getIfExists作業測試結果。
    3. 使用count作業計算結果。

select作業的結果

所有相符專案都會傳回為集合:

<recipient-collection>
    <recipient email="jane.smith@mycompany.com">
    <recipient email="john.harris@mycompany.com">
</recipient-collection>

若要反複檢查結果,請使用for each回圈:

for each (var rcp in res:recipient)
    logInfo(rcp.@email)

回圈包含本機收件者變數。 對於收件者集合中傳回的每個收件者,都會列印出收件者的電子郵件。 深入瞭解 logInfo函式。

getIfExists作業的結果

每個相符專案都會傳回為元素:

<recipient id="52,378,079">

如果沒有相符專案,則會傳回空白元素:

<recipient/>

您可以參照主索引鍵節點,例如@id屬性:

if (res.@id !=undefined)
    { // match was found
    …
    }

get作業的結果

會傳回一個相符專案作為元素:

<recipient id="52,378,079">

如果沒有相符專案,則會傳回錯誤。

TIP
如果您知道有相符專案,請使用get作業。 否則,請使用getIfExists作業。 如果您使用此最佳實務,則錯誤會顯示非預期的問題。 如果您使用get作業,請勿使用try…catch陳述式。 問題由工作流程的錯誤處理程式處理。

count作業的結果

傳回具有count屬性的專案:

<recipient count="200">

若要使用結果,請參考@count屬性:

if (res.@count > 0)
    { // matches were found
    …
    }

針對select作業,將此程式碼新增至工作流程中的JavaScript程式碼活動:

var myXML =
<queryDef schema="nms:recipient" operation="select">
    <select>
        <node expr="@firstName"/>
        <node expr="@lastName"/>
    </select>
</queryDef>

var query = xtk.queryDef.create(myXML)

var res = query.ExecuteQuery()

for each (var rcp in res.recipient)
    logInfo(rcp.@firstName + " " + rcp.@lastName)

由於select作業是預設作業,因此您不需要指定它。

此影片說明如何從資料庫讀取:

觸發工作流程 trigger-example

您可以程式設計方式觸發工作流程,例如,在技術工作流程中或處理使用者在網頁應用程式頁面上輸入的資訊。

工作流程觸發可透過使用事件來運作。 您可以對事件使用這些功能:

  • 若要張貼事件,您可以使用靜態PostEvent方法。 了解更多
  • 若要接收事件,您可以使用​ External signal ​活動。 了解更多

您可以透過不同方式觸發工作流程:

  • 您可以內嵌觸發工作流程,亦即從​ JavaScript code ​活動的主要指令碼觸發。

  • 另一個工作流程完成後,您可以觸發此工作流程:

    • 新增初始化指令碼至初始工作流程的​ End ​活動。

    • 在目標工作流程的開頭新增​ External signal ​活動。

      完成初始工作流程後,事件就會發佈。 會啟動傳出轉變並填入事件變數。 然後,目標工作流程會接收事件。

      note tip
      TIP
      最佳實務是,當您新增指令碼至活動時,請以雙連字型大小將活動名稱括住,例如-- end --進一步瞭解工作流程最佳實務。

PostEvent方法的語法:

PostEvent(
    String     //ID of the target workflow
    String     //Name of the target activity
    String     //Name of the transition to be activated in case of multiple transitions
    XML        //Event parameters, in the <variables/> element
    Boolean    //To trigger the target workflow only once, set this parameter to true.
)

在此範例中,工作流程完成後,會將簡短文字傳遞至​ wkfExampleReceiver ​工作流程的​ 訊號 ​活動:

var strLabel = "Adobe Campaign, Marketing that delivers"
xtk.workflow.PostEvent(
    "wkfExampleReceiver",
    "signal",
    "",
    <variables strLine={strLabel}/>,
    false)

因為最後一個引數設定為false,所以每次完成初始工作流程時,都會觸發​ wkfExampleReceiver ​工作流程。

觸發工作流程時,請牢記以下原則:

  • PostEvent命令以非同步方式執行。 命令會放置在伺服器佇列中。 方法會在事件發佈後傳回。
  • 必須啟動目標工作流程。 否則,錯誤會寫入記錄檔。
  • 如果目標工作流程已暫停,則會將PostEvent命令排入佇列,直到工作流程恢復為止。
  • 觸發的活動不需要進行中的任務。

本影片說明如何使用靜態API方法:

本影片說明如何觸發工作流程:

與資料庫互動 interact-example

這些範例顯示如何執行下列動作:

  • 在結構描述上使用getcreate方法,以使用非靜態SOAP方法
  • 建立執行SQL查詢的方法
  • 使用write方法插入、更新和刪除記錄

請依照下列步驟操作:

  1. 定義查詢:

    • 使用對應結構描述上的create方法擷取實體,例如xtk:workflow結構描述。 了解更多
    • 使用queryDef方法發出SQL查詢。
  2. 使用ExecuteQuery方法執行查詢。 了解更多

    使用for each回圈來擷取結果。

具有select子句的queryDef方法語法

<queryDef schema="schema_key" operation="operation_type">
    <select>
        <node expr="expression1">
        <node sql="expression2">
    </select>
    <where>
        <condition expr="expression1"/>
        <condition sql="expression2"/>
    </where>
    <orderBy>
        <node expr="expression1">
        <node sql="expression2">
    </orderBy>
    <groupBy>
        <node expr="expression1">
        <node sql="expression2">
    </groupBy>
    <having>
        <condition expr="expression1"/>
        <condition sql="expression2"/>
    </having>
</queryDef>

Create方法

範例1:選取記錄並寫入分錄

已選取位於​ wfExamples ​資料夾的工作流程的內部名稱。 結果會依內部名稱以遞增順序排序,並寫入日誌。

var query = xtk.queryDef.create(
    <queryDef schema="xtk:workflow" operation="select">
        <select>
            <node expr="@internalName"/>
        </select>
        <where>
            <condition expr="[folder/@name]='wfExamples'"/>
        </where>
        <orderBy>
            <node expr="@internalName" sortDesc="false"/>
        </orderBy>
    </queryDef>
    )

var res = query.ExecuteQuery()
for each (var w in res.workflow)
    logInfo(w.@internalName)

範例2:刪除記錄

系統會選取名為Chris Smith之所有收件者的名字、姓氏、電子郵件及ID。 結果會依電子郵件遞增順序排序,並寫入日誌。 使用delete作業來刪除選取的記錄。

// Build the query, create a query object and hold the object in a variable
var query = xtk.queryDef.create(
        <queryDef schema="nms:recipient" operation="select">
            <select>
                <node expr="@firstName"/>
                <node expr="@lastName"/>
                <node expr="@email"/>
                <node expr="@id"/>
            </select>
            <where>
                <condition expr="[folder/@label]='Recipients'"/>
                <condition expr="[@lastName]='Smith'"/>
                <condition expr="[@firstName]='Chris'"/>
            </where>
            <orderBy>
                <node expr="@email" sortDesc="false"/>
            </orderBy>
        </queryDef>
)

//Run the query using the ExecuteQuery method against the created object
var res = query.ExecuteQuery()

//Loop through the results, print out the person's name and email, then delete the records
for each (var rec in res.recipient)
    {
     logInfo("Delete record = Email: " + rec.@email + ', ' + rec.@firstName + ' ' + rec.@lastName)
     xtk.session.Write(<recipient xtkschema="nms:recipient" _operation="delete" id={rec.@id}/>)
    }

範例3:選取記錄並寫入分錄

在此範例中,使用非靜態方法。 已選取其資訊儲存在​ 1234 ​資料夾且其電子郵件網域名稱以「adobe」開頭的所有收件者的電子郵件和出生年份。 結果會依出生日期遞減排序。 收件者的電子郵件會寫入日誌。

var query = xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
    <select>
        <node expr="@email"/>
        <node sql="sEmail"/>
        <node expr="Year(@birthDate)"/>
    </select>
    <where>
        <condition expr="[@folder-id] = 1234 and @domain like 'adobe%'"/>
        <condition sql="iFolderId = 1234 and sDomain like 'adobe%'"/>
    </where>
    <orderBy>
        <node expr="@birthDate" sortDesc="true"/>
    </orderBy>
</queryDef>
)

var res = query.ExecuteQuery()
for each (var w in res.recipient)
    logInfo(w.@email)

Write方法

您可以插入、更新和刪除記錄。 您可以在Adobe Campaign中的任何結構描述上使用Write方法。 由於此方法為靜態方法,因此您不需要建立物件。 您可以使用下列操作:

  • update作業

  • insertOrUpdate作業,具有_key引數以識別要更新的記錄

    若您未指定​ 收件者 ​資料夾,則如果有相符專案,該記錄會更新到任何子資料夾中。 否則,會在根​ 收件者 ​資料夾中建立記錄。

  • delete作業

IMPORTANT
如果您使用Adobe Campaign v8,建議您針對Snowflake表格中的Write方法,搭配​ 擷取 ​和​ 資料更新/刪除 API使用預備機制。 深入了解.

範例1:插入或更新記錄

xtk.session.Write(
<recipient
    xtkschema="nms:recipient"
    _operation="insertOrUpdate" _key="@email"
    lastName="Lennon"
    firstName="John"
    email="johnlennon@thebeatles.com"
/>
)

範例2:刪除記錄

此範例結合了靜態方法和非靜態方法。

var query=xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
    <select>
        <node expr="@Id"/>
    </select>
    <where>
        <condition expr="[@email]='johnlennon@thebeatles.com'"/>
    </where>
</queryDef>
);

var res = query.ExecuteQuery()
for each (var w in res.recipient) {
xtk.session.Write(
    <recipient xtkschema="nms:recipient" _operation="delete" id={w.@id}/>
);
}

本影片說明如何使用非靜態API方法:

本影片說明在工作流程中使用非靜態API方法的範例:

相關主題

API檔案

recommendation-more-help
cffff7e4-091f-472e-87ca-52087599f99d