0

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

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

我如何拒绝该条目,比如它是否是重复条目?

4

3 回答 3

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;  

    }
于 2012-12-21T01:33:42.950 回答
0

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

您应该在数组级别进行这些迭代,因为它会更加高效和快速,您可以使用类似的方法获取数组中的数据

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

您还可以使用像 indexOf() 这样的 JavaScript 函数,如果找不到匹配项,则返回 -1;如果找到匹配项,则返回数组中的项目位置。

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

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

于 2012-08-05T08:34:04.687 回答
0

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

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

于 2013-02-12T11:54:15.110 回答