For loop 为什么在第二个循环中两次得到同一行?

For loop 为什么在第二个循环中两次得到同一行?,for-loop,google-apps-script,google-sheets,For Loop,Google Apps Script,Google Sheets,下面的代码运行时没有明显的错误,但尽管我已经查找了所有可能的原因,但我找不到它迭代正确行、将其标记为已处理(“Sim”)的原因,从2º迭代开始,它得到新行,但重复已迭代的其他行 function formToData() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var ss = sheet.getSheetByName("Form Responses 1"); var targetSheet = s

下面的代码运行时没有明显的错误,但尽管我已经查找了所有可能的原因,但我找不到它迭代正确行、将其标记为已处理(“Sim”)的原因,从2º迭代开始,它得到新行,但重复已迭代的其他行

function formToData() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var ss = sheet.getSheetByName("Form Responses 1");
  var targetSheet = sheet.getSheetByName("Cadastro de Cliente");
  var StartRow = 2;
  var RowRange = ss.getLastRow() - StartRow + 1;
  var WholeRange = ss.getRange(StartRow, 1, RowRange, 30);
  var AllValues = WholeRange.getValues();
  var message = "";

  for (var i = 0; i < AllValues.length; i++) {
    var currentRow = AllValues[i];
    //if row has been sent, then continue to next iteration
    if (currentRow[0] != "" && currentRow[29] != "Sim") {
      //set the row to look at
      var setRow = parseInt(i) + StartRow;

      var data = currentRow[0];
      var dataFormatted = Utilities.formatDate(data, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd/MM/yyyy', às 'HH:mm") + "hs";

      //set HTML template for information
      message +=
        "<p><b>Data: </b>" + dataFormatted + "</p>" +
        "<p><b>Unidade: </b>" + currentRow[1] + "</p>"

      //mark row as "sent"
      ss.getRange(setRow, 30).setValue("Sim");

      var values = targetSheet.getRange("A:A").getValues();
      var maxIndex = values.reduce(function (maxIndex, row, index) {
        return row[0] === "" ? maxIndex : index;
      }, 0);
      targetSheet.getRange(maxIndex + 2, 1, 1, 30)
        .setNumberFormat("@")
        .setValues([currentRow]);

      var sendTo = "email";
      var subject = "Cadastro de cliente novo";
      if (message) {
        MailApp.sendEmail({
          to: sendTo,
          subject: subject,
          name: "Comercial - Emape",
          htmlBody: message,
        });
      }
    }
  }//For loop closes
}
函数formToData(){
var sheet=SpreadsheetApp.getActiveSpreadsheet();
var ss=sheet.getSheetByName(“表单响应1”);
var targetSheet=sheet.getSheetByName(“客户卡”);
var StartRow=2;
var RowRange=ss.getLastRow()-StartRow+1;
var WholeRange=ss.getRange(StartRow,1,RowRange,30);
var AllValues=WholeRange.getValues();
var message=“”;
对于(var i=0;i”+
Unidade:“+currentRow[1]+”

” //将行标记为“已发送” ss.getRange(setRow,30).setValue(“Sim”); var values=targetSheet.getRange(“A:A”).getValues(); var maxIndex=values.reduce(函数(maxIndex,行,索引){ 返回行[0]=“maxIndex:索引; }, 0); targetSheet.getRange(最大索引+2,1,1,30) .setNumberFormat(“@”) .setValues([currentRow]); var sendTo=“电子邮件”; var subject=“新客户卡数据”; 如果(信息){ MailApp.sendmail({ 收件人:sendTo, 主题:主题,, 名称:“Comercial-Emape”, htmlBody:message, }); } } }//For循环结束 }

如果您能帮我找到缺陷,我将通知您。

我尝试复制此行为,但是,在静态工作表上,脚本按预期执行:

  • 将第30列中未标记的行设置为“Sim”
  • 从第一个空行(或a列为空的任何一行)开始,将这些行复制到单独的工作表中
  • 给定函数和工作表的名称,这可能是由Google表单生成的工作表。这些工作表是动态的,在脚本运行时,内容可能会更改,特别是在允许用户编辑响应的情况下

    作为一种解决方法,我建议在运行脚本之前锁定表单:


    此外,检查工作表和表格的内容是否存在“Sim卡“标记可能被新的或编辑的表单数据覆盖,可能工作表插入了30列而不是29列或更少。

    直到有人花时间在他的示例数据集上运行此代码。如果您有时间自己检查代码,我建议您使用
    console.log
    变量来监视for循环中的迭代步骤。通过这种方式,您可以看到代码失败的地方并找到错误。例如,
    console.log(currentRow)
    。如果您认为要在相同的行上再次迭代,则表示此变量的值没有正确更改。你可以找出哪个
    i
    it这样做,看看你的工作表是否有问题。打印值是调试任何程序中代码的最佳方式。语言。你好@Marios!我已经这样做了,currentRow logged是正确的。我认为在组成mesaqge和设置值(“Sim”)之间可能存在错误。。。我甚至尝试过电子表格.flush(),但它没有解决。