2013-11-28 27 views
0

現狀:

我有以下腳本,在OnEdit運行,但我想調整這個腳本來運行只有當有人添加新行的表。我如何運行腳本,只有當有人添加新行

腳本:

function DataValidation2(e) 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = ss.getActiveSheet(); 
    if (s.getName() == "Sheet1"){ 
    var cell = s.getRange('C3:C'); 
    var rule = SpreadsheetApp.newDataValidation().setAllowInvalid(false).requireValueInList(['0:15:00', '0:20:00']).build(); 
    cell.setDataValidation(rule); 
    } 
} 

如果可能執行這個腳本只有當有人使用BOTON添加新行添加包括在表的末尾?

最好的問候,

回答

2

有一個特殊的觸發器來檢測這樣的變化:onChange

如文檔中描述的,你甚至可以以編程方式創建它:

var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("myFunction") 
    .forSpreadsheet(sheet) 
    .onChange() 
    .create(); 

,然後像一個函數這將在每次更改時調用,這些更改會查看行數並在更改時執行某些操作,如果更改是其他操作,則不執行任何操作。

您可以添加更多的條件來處理其他情況,例如做什麼ID行,其中刪除

function myFunction(){ 
    var numRows = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getMaxRows(); 
    if(ScriptProperties.getProperty('numberOfRows')){ 
    var nRows = Number(ScriptProperties.getProperty('numberOfRows')); 
    if(nRows<numRows){ 
     //do something because rows have been added in this sheet 
     ScriptProperties.setProperty('numberOfRows',numRows);// update value with current value 
    } 
    } 
    ScriptProperties.setProperty('numberOfRows',numRows);// create a start value with current value of simply update if the trigger was called for another reason 
} 

編輯以下Wchiquito的評論

這裏是另一個(更簡單)版本,工作得很好:

function initializeTrigger(){ // run this only once to create a trigger if necessary 
    var sheet = SpreadsheetApp.getActive(); 
ScriptApp.newTrigger("myFunction") 
    .forSpreadsheet(sheet) 
    .onChange() 
    .create(); 
} 

function myFunction(e){ 
    Logger.log(e.changeType); 
    if(e.changeType=='INSERT_ROW'){ 
    // do Something 
    Browser.msgBox('New row(s) added'); 
    } 
} 
+2

Hav你考慮在'onChange()'事件中使用參數'changeType'中的'INSERT_ROW'嗎? – wchiquito

+0

你是對的,沒有考慮到......隨意發佈另一個答案,你的想法更好,因爲它使用GAS直接方法。 –

+0

你好, 我試圖將腳本集成到我的功能當somone添加或插入新行到工作表,但沒有工作......我不知道我需要把我的腳本的位置..仍然工作.. –