我在基于电子表格的脚本中有一个功能,当使用电子表格表单提交时会触发该功能:
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("scriptadmin@uniben.edu", "New Mail Request", "Someone submited data");
}
如何拒绝该条目,例如它是否为重复条目?
答案 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/