2012-08-05 60 views
0

我有一個基於電子表格的腳本函數時提交與電子表格形式,由被觸發:谷歌腳本拒絕電子表格提交

function onEntry(e){ 
    Logger.log(e); 
    MailApp.sendEmail("[email protected]", "New Mail Request", "Someone submited data"); 
} 

我怎麼能拒絕入境,說,如果這是一個重複的條目?

回答

0

使用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團隊檢查過)

+0

感謝您的答覆,但我在拒絕入境,如果我發現它會複製另外一個電子表格中的實際興趣。大多數事件處理程序可以通過從event.preventDefault()或event.setCancled()等事件中獲取行爲,方法是從處理程序返回false。如果我確定它是重複的,如何防止輸入進入電子表格。再次感謝。 – chalu 2012-08-05 21:10:48

+0

嗨,請參閱編輯。 – 2012-08-05 22:02:41

+0

事實證明,解決方案是刪除條目(它將是最後一個條目),如果它重複一個現有條目。還建議在鎖定(鎖定服務)內執行此操作(鎖定服務) – chalu 2012-08-09 10:12:14

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; 

    } 
0

我在做同樣的事情,但根本沒有腳本,只是通過電子表格功能。對於我來說,這種事情就像SQL一樣,並且非常有興趣去做。

對於你的問題,這個鏈接將幫助:http://www.labnol.org/software/find-remove-duplicate-records-google-docs/5169/

+0

雖然您發佈的鏈接可能會解決所問的問題,但請考慮鏈接斷開時您的答案的用處。您應該將該網站的相關信息添加到您的答案中,並使用上面發佈的鏈接對該網站進行評分。 – Ren 2013-02-12 12:12:32

+0

感謝您通知我,但我不允許複製與該網站相關的內容,因爲網站所有者保留了內容的一些版權。您可以在該網站的底部看到這樣一行:「該內容受Amit Agarwal版權保護,不得在其他網站上覆制。」所以我很抱歉。 – 2013-02-12 14:48:43

+0

夠公平的。沒有看到那個隱藏在那裏。雖然版權意味着你不能複製和粘貼內容(你不應該這樣做),但它並不禁止你寫出問題解決方法的摘要;) – Ren 2013-02-12 14:52:02

相關問題