为什么这个JavaScript在Zapier中循环两次?

时间:2018-05-28 13:37:55

标签: javascript zapier

这是video,展示了我所挣扎的东西。

以下是该流程的高级描述,后面是我编写的实际JavaScript代码。

PROCESS 我建了2个Zaps,每个都运行如下:

第1步 - 触发(Cognito Form,具有重复部分)

第2步 - JavaScript代码(为一个重复部分创建表单字段的数组,并使用.split将它们分成单独的字符串)

第3步 - 操作(为每个字符串创建ZOHO CRM任务)

第一个Zap在表单的一个部分上运行(Visits with Sales),第二个zap在表单的不同部分上运行(Visits without Sales)。这些Zaps中的每一个都可以自行运行,所以我知道代码很好,但我希望通过组合代码将两个Zaps合二为一。

我尝试通过五个步骤来结合:

  

触发器 - Code1 - Zoho1 - Code2 - Zoho2

但是每次重复Zoho2任务

然后我尝试重新排序这五个步骤:

  

触发器 - Code1 - Code2 - Zoho1 - Zoho2

但现在Zoho1任务和Zoho2任务重复了。

最后,我尝试将所有JavaScript代码合并为一个:

  

跳跳虎 - CombinedCode1 + 2 - Zoho 1 - Zoho2

但只有" Code2"中的数组中的字符串;当我在Zoho1中映射它们时,我可以使用它。

CODE:

if (inputData.stringVSAccount == null) {
  var listVSAccountArray = [];
  var listVSUnitsArray = [];
  var listVSPriceArray = [];
  var listVSNotesArray = [];
  var listVSVisitCallArray = [];
} else {
  var listVSAccountArray = inputData.stringVSAccount.split(",");
  var listVSUnitsArray = inputData.stringVSUnits.split(",");
  var listVSPriceArray = inputData.stringVSPrice.split(",");
  var listVSNotesArray = inputData.stringVSNotes.split(",");
  var listVSVisitCallArray = inputData.stringVSVisitCall.split(",");
}
var output = [];
var arrayNos = listVSAccountArray.length;
var i = 0;
do {
  var thisItemVSAccount = new String(listVSAccountArray[i]);
  var thisItemVSUnits = new String(listVSUnitsArray[i]);
  var thisItemVSPrice = new String(listVSPriceArray[i]);
  var thisItemVSNotes = new String(listVSNotesArray[i]);
  var thisItemVSVisitCall = new String(listVSVisitCallArray[i]);
  var thisItemObj = {};
  thisItemObj.itemVSAccount = thisItemVSAccount;
  thisItemObj.itemVSUnits = thisItemVSUnits;
  thisItemObj.itemVSPrice = thisItemVSPrice;
  thisItemObj.itemVSNotes = thisItemVSNotes;
  thisItemObj.itemVSVisitCall = thisItemVSVisitCall;
  output.push({ thisItemObj });
  i++;
} while (i < arrayNos);

//This is where the second zaps code is pasted in the combined version
if (inputData.stringOVAccount == null) {
  var listOVAccountArray = [];
  var listOVNotesArray = [];
  var listOVVisitCallArray = [];
} else {
  var listOVAccountArray = inputData.stringOVAccount.split(",");
  var listOVNotesArray = inputData.stringOVNotes.split(",");
  var listOVVisitCallArray = inputData.stringOVVisitCall.split(",");
}
var output = [];
var arrayNos = listOVAccountArray.length;
var i = 0;
do {
  var thisItemOVAccount = new String(listOVAccountArray[i]);
  var thisItemOVNotes = new String(listOVNotesArray[i]);
  var thisItemOVVisitCall = new String(listOVVisitCallArray[i]);
  var thisItemObj = {};
  thisItemObj.itemOVAccount = thisItemOVAccount;
  thisItemObj.itemOVNotes = thisItemOVNotes;
  thisItemObj.itemOVVisitCall = thisItemOVVisitCall;
  output.push({ thisItemObj });
  i++;
} while (i < arrayNos);

我本周刚开始学习JavaScript,感觉我错过了一些明显的东西,也许是一组括号。感谢您的帮助

2 个答案:

答案 0 :(得分:0)

David来自Zapier平台团队。您正在遇到一个令人困惑且基本上未记录的功能,其中代码步骤之后的项目针对返回的每个项目运行。这通常是期望的行为 - 当您返回3个提交时,您想要创建3个记录。

在您的情况下,它还会多次运行后续不相关的操作,这听起来像是不受欢迎的。在这种情况下,有两个zaps可能更容易。或者,如果&#34; Zoho2&#34;只发生一次,把它放在第一位,让分支发生在下游。

另外,我有一些未经请求的javascript建议(因为你提到你是初学者)。查看Array.forEachdocs),这将允许您遍历数组而无需管理任意数量的变量(每次都是您自己的i)。此外,尽可能使用letconst而不是var - 它会使您的变量尽可能地缩小范围,这样您就不会意外地将值泄漏到其他区域。

如果您有任何其他问题,请与我们联系!

答案 1 :(得分:0)

只需注意 - 您在代码块的两个段中声明了相同的数组变量output - 第二个声明将被忽略。

使用componentless-routes方法迭代数组,它将显着清理代码。您也不需要精心构建要推入output数组的对象。

这可能无法解决您的问题,但代码更容易解​​决。

var listVSAccountArray = [],
    listVSUnitsArray = [],
    listVSPriceArray = [],
    listVSNotesArray = [],
    listVSVisitCallArray = [],
    output = [];

if (typeof inputData.stringVSAccount === 'string') {
  listVSAccountArray = inputData.stringVSAccount.split(',');
  listVSUnitsArray = inputData.stringVSUnits.split(',');
  listVSPriceArray = inputData.stringVSPrice.split(',');
  listVSNotesArray = inputData.stringVSNotes.split(',');
  listVSVisitCallArray = inputData.stringVSVisitCall.split(',');
}

// iterate over the array using forEach()
listVSAccountArray.forEach(function(elem, index){
  // elem is listVSAccountArray[index]
  output.push({
    itemVSAccount: elem,
    itemVSUnits: listVSUnitsArray[index],
    itemVSPrice: listVSPriceArray[index],
    itemVSNotes: listVSNotesArray[index],
    itemVSVisitCall: listVSVisitCallArray[index]
  })
})

//This is where the second zaps code is pasted in the combined version
var listOVAccountArray = [],
    listOVNotesArray = [],
    listOVVisitCallArray = [],
    output_two = []; // changed the name of the second output array

if (typeof inputData.stringOVAccount === 'string') {
  listOVAccountArray = inputData.stringOVAccount.split(',');
  listOVNotesArray = inputData.stringOVNotes.split(',');
  listOVVisitCallArray = inputData.stringOVVisitCall.split(',');
}

// iterate over the array using forEach()
listOVAccountArray.forEach(function(elem, index){
  // elem is listOVAccountArray[index]
  output_two.push({
    itemOVAccount: elem,
    itemOVNotes: listOVNotesArray[index],
    itemOVVisitCall: listOVVisitCallArray[index]
  });
});