Я использовал функцию InvokeRetrieve AMPScript для объекта ListSubscriber, чтобы получить список идентификаторов списка и статусов, к которым принадлежит подписчик.

Вся документация, которую я могу найти в Интернете, обычно показывает цикл for для отображения всех наборов данных в массиве. Что я хочу сделать, так это выполнить поиск в этом массиве, чтобы найти конкретное значение.

Например:

set @rr = CreateObject("RetrieveRequest")

SetObjectProperty(@rr, "ObjectType", "ListSubscriber")
 AddObjectArrayItem(@rr,"Properties","ListID") 
 AddObjectArrayItem(@rr,"Properties","SubscriberKey")
 AddObjectArrayItem(@rr,"Properties","Status")

set @sfp = CreateObject("SimpleFilterPart")
 SetObjectProperty(@sfp, "Property", "SubscriberKey")
 SetObjectProperty(@sfp, "SimpleOperator", "equals")
 AddObjectArrayItem(@sfp, "Value", @subkey)

SetObjectProperty(@rr, "Filter", @sfp)

set @listStatuses = InvokeRetrieve(@rr, @rrStatus, @rrRequestID)

Может вернуть объект API с массивом

Ключ подписчика: email1
Идентификатор списка: 101
Статус: активен

Ключ подписчика: email2
Идентификатор списка: 102
Статус: активен

Ключ подписчика: email3
Идентификатор списка: 103
Статус: Отписано

Как мне лучше всего найти @listStatuses по ListID, чтобы найти статус?

Благодарность!

1
Gortonington 29 Окт 2018 в 22:57

1 ответ

К сожалению, вы не можете выполнять поиск чего-либо, кроме DataView или Data Extension через AMPScript.

В связи с этим при работе в AMPScript у вас остается 2 варианта:

  1. Добавление второй части простого фильтра (SFP), создание сложный фильтр. Этот SFP будет использовать оператор 'IN", чтобы сегментировать результаты только на группу списков, которые вы хотите найти.

Например

/* Create LeftOperand SimpleFilterPart */

  Set @sfp1 = CreateObject("SimpleFilterPart")
  SetObjectProperty(@sfp, "Property", "SubscriberKey")
  SetObjectProperty(@sfp, "SimpleOperator", "equals")
  AddObjectArrayItem(@sfp, "Value", @subkey)

/* Create RightOperand SimpleFilterPart */

  Set @sfp2 = CreateObject("SimpleFilterPart")
  SetObjectProperty(@sfp, "Property", "ListID")
  SetObjectProperty(@sfp, "SimpleOperator", "IN")
  AddObjectArrayItem(@sfp, "Value", @ListIDs)

/* Adding two Simple filters together to create a Complex filter */

  Set @cf1 = CreateObject("ComplexFilterPart")
  SetObjectProperty(@cf1,"LeftOperand",@sfp1)
  SetObjectProperty(@cf1,"RightOperand",@sfp2)
  SetObjectProperty(@cf1,"LogicalOperator","AND")

SetObjectProperty(@rr,"Filter",@cf1)


  1. Если вы не можете использовать фильтр, описанный выше, вам нужно будет выполнить цикл for с условным выражением, чтобы убедиться, что извлекаются/записываются только те записи, которые соответствуют вашим критериям.

Например

set @listStatuses = InvokeRetrieve(@rr, @rrStatus, @rrRequestID)

FOR @i=1 TO Rowcount(@listStatuses) DO

  SET @row = ROW(@listStatuses, @i)

  SET @SubscriberKey = Field(@row, "SubscriberKey")
  SET @ListID = Field(@row, "ListID")
  SET @Status = Field(@row, "Status")

  IF @ListID == @ListID1 THEN

    SET @doAction = 1

  ELSEIF @ListID == @ListID2 THEN

    SET @doAction = 1

  ELSEIF @ListID == @ListID3 THEN

    SET @doAction = 1
  /* Etc.... */
  ELSE

    SET @doAction = 0

  ENDIF

  IF @doAction = 1 THEN

   /* Action you wish to do */

  ENDIF

NEXT @i

Если ваши идентификаторы списка сохранены внутри другого набора строк, вы также можете иметь цикл for внутри вашего цикла for для повторного прохождения и проверки с помощью условий. Я не рекомендую это делать, если только вы не ожидаете больших объемов, так как это приведет к большому расходу ресурсов и увеличению времени выполнения (возможно, к тайм-ауту).

(Предполагая, что это среда без отправки), я бы также рекомендовал изучить использование WSProxy для ваших вызовов API вместо метода AMPScript.

Это приведет вас к использованию SSJS (версия SFMC), который может обеспечить большую гибкость взаимодействия, поскольку он будет возвращен в объекте JSON. Не стесняйтесь искать основные методы JavaScript, чтобы извлекать только определенные значения из массивов/объектов.

5
Gortonington 29 Окт 2018 в 23:36