如何对 Zapier 代码输出中返回的数组应用重复数据删除

How to apply deduplication for an array returned in Zapier Code output

我有一个 Zapier 代码块,它为 JSON 数组执行 fetch 并预处理这些数据。我无法将 Zapier Webhook 用于轮询,因为我需要对数据进行一些处理。

Zapier Webhook 提供重复数据删除功能,方法是使 id 参数与从 URL 端点返回的数组中的项目相关联。我怎样才能为 Zapier Code 实现同样的目标?目前,我的 zap 正在尝试处理和触发相同的数据两次。这导致每次触发代码时,Zapier 都会尝试发送同一条推文两次的错误。

这是我的代码返回的模拟数据:

output = [{id: 1, name: "foo"}, {id: 2, name: "bar"}]

目前,在没有重复数据删除的情况下,我收到了这封电子邮件并禁用了我的 zap:

Your Zap named XXX was just stopped. This happened because our systems detected this Zap posted a duplicate tweet, which is against Twitter's Terms Of Service.

您可以使用 Zapier 的存储来实现此目的。理想的流程是:

  1. 触发器
  2. Zapier 存储 [获取值(使用存储密钥 = lastItemId)]
  3. Zapier 代码(过滤数组 return 仅那些 id 大于 lastItemId 的记录)
  4. Zapier 存储(设置值):使用 Zapier 代码步骤
  5. 处理的最后一项更新 lastItemId

您也可以使用 StoreClient 代替 zapier 存储,但始终更新现有键 lastItemId 并将记录的 ID 与 ```lastItemId`` 进行比较,最后更新 StoreCLient 键( lastItemId)

根据 Kishor Patidar 的回答,这是我的代码。我正在添加示例代码,这里太花时间弄清楚了。具体来说,在我的例子中,项目不能按出现的顺序处理(没有 运行 计数器主键),而且 Zapier 可以在未来多长时间内安排操作有一些限制(你最多只能延迟一个个月)。

商店也有 500 个钥匙的限制。

// We need store for deduplication
// https://zapier.com/help/create/code-webhooks/store-data-from-code-steps-with-storeclient
// https://www.uuidgenerator.net/
var store = StoreClient('xxx');

// Where do we get our JSON data
const url = "https://xxx";

// Call FB public backend to get scheduled battles
const resp = await fetch(url);
const data = await resp.json();

let processed = [];


for(let entry of data.entries) {
    
  console.log("Processing entry", entry.id);

  // Filter out events with a non-wanted prize type
  if(entry.prizes[0].type != "mytype") {
    continue;
  }
  
  // Zapier can only delay tweets for one month
  // As the code fires every 30 minutes, 
  // we are only interested scheduling tweets that happen
  // very soon
  const when = Date.parse(entry.startDate);
  const now = Date.now();
  
  if(!when) {
     throw new Error("startDate missing");
  }
  
  if(when > now + 24 * 3600 * 1000) {
    // Milliseconds not going to happen for next 24h
    console.log("Too soon to schedule", entry.id, entry.startDate, now);
    continue;
  } else {
    console.log("Starting to schedule", entry.id, entry.startDate, now);
  }
  
  const key = "myprefix_" + entry.id;
  
  // Do manual deduplication
  // 
  const existing = await store.get(key);
  if(existing) {
      // Already processed
    console.log("Entry already processed", entry.id);
    continue;
  }  
  
  // Calculate some parameters on entry based on nested arrays
  // and such
    
  entry.startTimeFormat = "HH:mm";
 
  // Generate URL for the tweet
  entry.signUpURL = `https://xxx/${entry.id}`;
  processed.push(entry);
  
  // Do not tweet this entry twice,
  // by setting a marker flag for it in store
  await store.set(key, "deduplicated");

}

output = processed;