我在基于电子表格的脚本中有一个函数,该函数在使用电子表格表单提交时触发:
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}
我如何拒绝该条目,比如它是否是重复条目?
我在基于电子表格的脚本中有一个函数,该函数在使用电子表格表单提交时触发:
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}
我如何拒绝该条目,比如它是否是重复条目?
晚了 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;
}
使用有关事件的文档,您必须选择要检查的数据(用户名、特定字段...)并将其与电子表格中已有的数据进行比较。
您应该在数组级别进行这些迭代,因为它会更加高效和快速,您可以使用类似的方法获取数组中的数据
var data = SpreadsheetApp.openById(key).getDataRange().getValues();
您还可以使用像 indexOf() 这样的 JavaScript 函数,如果找不到匹配项,则返回 -1;如果找到匹配项,则返回数组中的项目位置。
实际上有很多方法可以做到这一点,但你的问题太模糊了,不知道什么是最好的......
编辑:根据您的评论,我建议您让重复的表单数据进入工作表,然后使用脚本删除重复项。您可以在 a 或计时器上运行此脚本,on form submit trigger
使其每天或每小时运行一次,并且仅当最后一个条目是新条目(未找到重复项)时才发送电子邮件......取决于您的用例。图库中有一个脚本可以很好地完成这项工作,它是由贡献很多的 GAS TC Romain Vialard编写的。(上面的链接指向脚本描述,但您也可以在公共图库中获取它,只需搜索“删除重复项”,您会看到其他脚本这样做,图库中的所有脚本都已由 GAS 团队检查)
我正在做同样的事情,但根本没有脚本,只是通过电子表格功能。这类事情对我来说就像 SQL 一样,非常有兴趣去做。
对于您的问题,此链接将有所帮助:http ://www.labnol.org/software/find-remove-duplicate-records-google-docs/5169/