我有一個基於電子表格的腳本函數時提交與電子表格形式,由被觸發:谷歌腳本拒絕電子表格提交
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("[email protected]", "New Mail Request", "Someone submited data");
}
我怎麼能拒絕入境,說,如果這是一個重複的條目?
我有一個基於電子表格的腳本函數時提交與電子表格形式,由被觸發:谷歌腳本拒絕電子表格提交
function onEntry(e){
Logger.log(e);
MailApp.sendEmail("[email protected]", "New Mail Request", "Someone submited data");
}
我怎麼能拒絕入境,說,如果這是一個重複的條目?
使用documentation on events您必須選擇要檢查的數據(用戶名,特定字段...)並將其與電子表格中已有的數據進行比較。
你應該做一個陣列級別這些迭代,因爲這將是更爲有效和快速的,你可以使用類似
var data = SpreadsheetApp.openById(key).getDataRange().getValues();
得到數組數據你也可以使用類似的indexOf javascript函數()如果找到匹配項,則返回-1(如果找到匹配項,則返回-1)或項目位置。
其實有很多方法可以做到這一點,但你的問題太模糊知道會是最好的......
編輯:下您的意見,我建議你讓副本表單數據進入工作表,然後使用腳本刪除重複項。您可以在on form submit trigger
或定時器上運行該腳本,讓它每天或每小時運行一次,並且只有在最後一個條目是新條目(沒有找到重複條目)時才發送電子郵件......具體取決於您的使用情況。 有a script in the gallery這項工作做得很好,它是由Romain Vialard寫的,這是一個貢獻了很多的GAS TC。 (上面的鏈接轉到腳本描述中,但是您也可以在公共圖庫中找到它,只要搜索「刪除重複項」即可看到其他腳本可以執行此操作,畫廊中的所有腳本都已由GAS團隊檢查過)
遲了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;
}
我在做同樣的事情,但根本沒有腳本,只是通過電子表格功能。對於我來說,這種事情就像SQL一樣,並且非常有興趣去做。
對於你的問題,這個鏈接將幫助:http://www.labnol.org/software/find-remove-duplicate-records-google-docs/5169/
雖然您發佈的鏈接可能會解決所問的問題,但請考慮鏈接斷開時您的答案的用處。您應該將該網站的相關信息添加到您的答案中,並使用上面發佈的鏈接對該網站進行評分。 – Ren 2013-02-12 12:12:32
感謝您通知我,但我不允許複製與該網站相關的內容,因爲網站所有者保留了內容的一些版權。您可以在該網站的底部看到這樣一行:「該內容受Amit Agarwal版權保護,不得在其他網站上覆制。」所以我很抱歉。 – 2013-02-12 14:48:43
夠公平的。沒有看到那個隱藏在那裏。雖然版權意味着你不能複製和粘貼內容(你不應該這樣做),但它並不禁止你寫出問題解決方法的摘要;) – Ren 2013-02-12 14:52:02
感謝您的答覆,但我在拒絕入境,如果我發現它會複製另外一個電子表格中的實際興趣。大多數事件處理程序可以通過從event.preventDefault()或event.setCancled()等事件中獲取行爲,方法是從處理程序返回false。如果我確定它是重複的,如何防止輸入進入電子表格。再次感謝。 – chalu 2012-08-05 21:10:48
嗨,請參閱編輯。 – 2012-08-05 22:02:41
事實證明,解決方案是刪除條目(它將是最後一個條目),如果它重複一個現有條目。還建議在鎖定(鎖定服務)內執行此操作(鎖定服務) – chalu 2012-08-09 10:12:14