谷歌脚本拒绝电子表格提交

时间:2012-08-05 07:09:36

标签: google-apps-script

我在基于电子表格的脚本中有一个功能,当使用电子表格表单提交时会触发该功能:

function onEntry(e){
  Logger.log(e);
  MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}

如何拒绝该条目,例如它是否为重复条目?

3 个答案:

答案 0 :(得分:0)

使用documentation on events,您必须选择要检查的数据(用户名,特定字段...),并将其与电子表格中已有的数据进行比较。

你应该在数组级别进行这些迭代,因为它会更高效,更快,你可以使用像

这样的数据获取数组

var data = SpreadsheetApp.openById(key).getDataRange().getValues();

你也可以使用像indexOf()那样的javascript函数,如果找不到匹配则返回-1,如果找到匹配则返回数组中的项位置。

实际上有很多方法可以做到,但你的问题太模糊了,不知道什么是最好的......

编辑 根据您的评论,我建议您让重复的表单数据进入工作表,然后使用脚本删除重复项。您可以在on form submit trigger或计时器上运行此脚本以使其每天或每小时运行,并且仅在最后一个条目是新条目(未找到重复项)时发送电子邮件...具体取决于您的用例。 有a script in the gallery可以很好地完成工作,它由 Romain Vialard 编写,这是一个贡献很多的GAS TC。 (上面的链接转到脚本描述,但您也可以在公共图库中获取它,只需搜索“删除重复项”,您将看到其他脚本执行此操作,图库中的所有脚本都已由GAS团队检查过)

答案 1 :(得分:0)

迟到4个月,但迟到总比没有好。我相信这个功能几乎可以满足最初的要求。即“如果我认为该条目是重复的,我如何阻止该条目进入电子表格”。这不是所要求的,但非常接近。

此代码针对该工作表中的所有行,针对另一个工作表中的同一列检查一列。假设您在工作表上列出了公司或客户。该列表包括姓名,电话,地址等。让我们说您要检查电话号码 - 如果您当前输入的电话号码已经在您的客户端表上,那么不允许进入 - 或者更准确地说清楚进入后立即出来。

我确信更有经验的成员能够指出缺陷,但它对我有用。 我相信它也适用于工作表中间的电话号码被更改的情况 - 所以它不仅仅是被检查的最后一行,它是被编辑的行被检查 - 我没有测试这个特殊情况。另外,我对变量名做了一些修改以保护无辜者......希望我这样做时不会弄乱任何东西。

我从另一个由onEdit触发的函数中调用此函数。从理论上讲,它应该能够作为onEdit触发器本身安装。我希望有人觉得它很有用。

function checkNewEntryForDuplicate(e) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var entrySheet = SpreadsheetApp.getActiveSheet();
      var clientSheet = ss.getSheetByName("Clients");  
      var r = entrySheet.getActiveCell();
      var lastCol = entrySheet.getLastColumn();

      // If this had any consistency, we'd be able to get the row from entrySheet the same
      // as we get column.  But there is no getRow() method at the sheet level.

      var rowNum = r.getRow(); 

      var clientData=clientSheet.getDataRange().getValues();
      var phoneColumnOffset=getPhoneColumnOffset(); // You'll need to get the offset elsewhere.  I have a function that does that.
      var columnNum=e.range.getColumn();  // column that is currently being edited

      if (columnNum != phoneColumnOffset+1)   // no point in doing anything else if it's not the column we're interested in.
        return 0;

      var entryRow=entrySheet.getRange(rowNum, 1, 1, lastCol);              
      var phoneNum = e.range.getValue();

      // iterate over each row in the clientData 2-dimensional array. 
      for(i in clientData){
        var row = clientData[i];
        var duplicate = false;

      // For each row this conditional statement will find duplicates

          if(row[phoneColumnOffset] == phoneNum){
            duplicate = true;
            var msg="Duplicate Detected.  Please do not enter.  Deleting it..."
            Browser.msgBox(msg);
            entryRow.clearContent();
            entryRow.clearComment();
            return duplicate;
          }
      }
    return duplicate;  

    }

答案 2 :(得分:0)

我正在做相同的事情,但根本没有脚本,只是通过电子表格功能。对我来说,这类事情就像SQL一样,非常有兴趣。

对于您的问题,此链接有助于:http://www.labnol.org/software/find-remove-duplicate-records-google-docs/5169/