1

我有我的谷歌問題的Apps腳本在我的電子表格 - 此代碼的工作非常好,但是我有一個問題,即有時它會刪除該行再經過直下一行?我花了幾個小時來質疑這個問題,它在我自己完美地執行代碼時工作正常,但是當我從電子表格執行代碼時,它不起作用?Google Apps腳本 - sheet.deleterow()刪除行和下一行?

該計劃是當用戶將Y值輸入到單元格中時,這意味着某人已完成並將從學習表單中的信息複製到完成的工作表中 - 當此代碼觸發編輯時,有時會刪除該行它應該,但有時然後下面的行 - 爲什麼是這樣,並有無論如何修復它?

function myOnEdit(e) { 
// ----------------------------------------------------------------------------- 
// This function will run whenever a cell is edited 
// ----------------------------------------------------------------------------- 
// ------------------------------------------------------------------------- 
// Get Active sheet 
// ------------------------------------------------------------------------- 
var sheet = ss.getActiveSheet(); 
// ------------------------------------------------------------------------- 
// ------------------------------------------------------------------------- 
// Get Active cell 
// ------------------------------------------------------------------------- 
var mycell = ss.getActiveSelection(); 
var cellcol = mycell.getColumn(); 
var cellrow = mycell.getRow(); 
// ------------------------------------------------------------------------- 
if (sheet.getName() == "In Learning"){ // Check to see if the sheet is "In Learning" 
if (cellcol == 19 && cellrow > 2){ // Check to see if the column is the learner complete column 
    if (mycell.getValue() == "Y"){ 
    var targetSheet = ss.getSheetByName("Completions"); // Get the Completions Sheet 
    var targetrow = getFirstEmptyRow(targetSheet)+1; // Find the last row (prevents loads of empty rows horray) 
    var target = targetSheet.getRange(targetrow, 1); // Copy the learner information 
    sheet.getRange(cellrow, 1, 1, cellcol-1).moveTo(target); // Move the information 
    sheet.deleteRow(cellrow); // Delete it from in learning 
    SpreadsheetApp.getActiveSpreadsheet().toast('Learner has been completed', 'Completed', 3); // Alert the user 
    sendEmail(learnerObjects, (cellrow-1)); 
    deleted = true; 
    } 
    else if (mycell.getValue() == "W"){ 
    var targetSheet = ss.getSheetByName("Withdrawals"); // Get the withdrawals sheet 
    var targetrow = getFirstEmptyRow(targetSheet)+1; // Find the last row 
    sheet.getRange(cellrow, 1, 1, 4).moveTo(targetSheet.getRange(targetrow, 1)); // Copy learner information and move it 
    sheet.getRange(cellrow, 10, 1, 1).moveTo(targetSheet.getRange(targetrow, 5)); // Copy learner information and move it 
    sheet.getRange(cellrow, 6, 1, 2).moveTo(targetSheet.getRange(targetrow, 6)); // Copy learner information and move it 
    sheet.deleteRow(cellrow); //Delete it from in learning 
    SpreadsheetApp.getActiveSpreadsheet().toast('Learner has been Withdrawn', 'Withdrawn', 3); // Alert the user 
    deleted = true; 
    } 
    else { 
    mycell.setValue("N"); 
    } 
} 
switch(cellcol){ // Otherwise check to see if the user is messing with formulas 
    case 12: mycell.setFormula("=CONTINUE(L2, " + cellrow-1 + ", 1)"); 
    SpreadsheetApp.getActiveSpreadsheet().toast('Formula Corrected', 'Warning', 3); 
    break; 
    case 14: mycell.setFormula("=CONTINUE(N2, " + cellrow-1 + ", 1)"); 
    SpreadsheetApp.getActiveSpreadsheet().toast('Formula Corrected', 'Warning', 3); 
    break; 
    case 15: mycell.setFormula("=CONTINUE(O2, " + cellrow-1 + ", 1)"); 
    SpreadsheetApp.getActiveSpreadsheet().toast('Formula Corrected', 'Warning', 3); 
    break; 
} 
if (deleted == false && sheet.getRange(cellrow,19).getValue() == "") 
{ 
    sheet.getRange(cellrow,19).setValue("N"); 
} 
} 
if (sheet.getName() == "Completions"){ 
if (cellcol == 19 && cellrow > 1){ // Check to see if the column is the learner complete column 
    if (mycell.getValue() == "Y"){ 
    var targetSheet = ss.getSheetByName("In Learning"); // Get the Completions Sheet 
    var targetrow = getFirstEmptyRow(targetSheet)+1; // Find the last row (prevents loads of empty rows horray) 
    var target = targetSheet.getRange(targetrow, 1); // Copy the learner information 
    sheet.getRange(cellrow, 1, 1, cellcol-1).moveTo(target); // Move the information 
    sheet.deleteRow(cellrow); // Delete it from in learning 
    SpreadsheetApp.getActiveSpreadsheet().toast('Learner completion has been revoked', 'Revoked Completion', 3); // Alert the user 
    deleted = true; 
    } 
    else { 
    mycell.setValue("N"); 
    } 
} 
} 
} 
+0

也許確實正在執行代碼時兩次是自動的。放一個'Browser.msgBox'來確保。 –

+0

這似乎是這樣,我剛剛在那裏測試它,並彈出一個msgbox兩次。有沒有其他方法? – Andy

+1

我無法重現這一點,請嘗試啓動一個新的'onEdit'來測試它是否運行兩次。然後在小步驟中使其更加複雜,直到達到當前的代碼。一直測試,直到你指出問題。如果您可以附帶一個非常簡單的代碼,任何人都可以複製和重現問題,那麼幫助起來會更容易。 –

回答

0

這當表單提交聽起來像一個類似的問題與onsubmit。這是一個已知的Google問題,腳本有時會運行兩次 - 我已經看到用戶登錄生成事件的地方與編寫腳本的用戶名不同。我發現腳本是以兩個用戶重複我試圖實現的操作的方式運行的。

我的解決方法是,以檢查在片材爲這是每次腳本運行設定的值的單元格的,所以腳本檢查第一,如果它已經之前運行的代碼塊採取行動跑去。

0

試試這個:

var mycell = e.source.getActiveSelection(); 
+0

Nah,仍然有時會刪除兩行「/。 – Andy

+0

你能否驗證我的活動項目觸發器? – nwill001

+0

myOnEdit from電子表格編輯是唯一的觸發器 – Andy

0

這是一個奇怪的一個。在簡單的腳本測試與功能onEdit(E)的組合,不解決它,比如:

function onEdit(e){ 
    var mycell = e.range // or SpreadsheetApp.getActiveSheet().getActiveRange() 
    e.source.deleteRow(mycell.getRow())// or SpreadsheetApp.getActiveSheet().deleteRow(mycell.getRow()) 
} 

相反,所有的變化似乎創造.deleteRow()連續的兩個實例,證實在問題表示。這有可能是一個刪除的行onEdit的第一次迭代,然後觸發該行的onEdit的第二個實例由於刪除(另一個一changeType)。 changeType是不可訪問的,因爲它是一個簡單的觸發器。

這是一個變通使用PropertiesService,似乎解決這個問題對我的使用情況:

function onEdit(e){ 

var delete_count = PropertiesService.getScriptProperties().getProperty("delete_count"); 

if (delete_count == null) { 
    e.source.deleteRow(e.range.getRow())//could call some other function here 
    var properties = PropertiesService.getScriptProperties(); 
    properties.setProperty("delete_count", 1) 
    } 
    PropertiesService.getScriptProperties().deleteProperty("delete_count") 
} 

從本質上講,一起阻止只是額外onEdit的一個(E) - > .deleteRow()實例。也許安裝而不是簡單的觸發器也可能工作。