2015-05-14 36 views
0

我有兩張不同的紙張,第一張是我所有數據存儲和更改的位置。在更新第一張紙時,它會移至第二張紙上。我試圖弄清楚,如果更新後,我可以從第二張表中移動一行到第二張表格中的另一個表格,基於列Q或列17中的數據。這是我目前擁有的,但它不似乎在移動任何東西。這甚至有可能嗎?我可以移動從其他工作表更新的行嗎?

function onUpdate() { 

    var sheetNameToWatch = "Raw Data"; 
    var columnNumberToWatch = 17; // column A = 1, B = 2, etc. 
    var valueToWatch = ["Full", "Partial", "Process", "Conditional", "Fail", "Exemption"]; 
    var sheetNameToMoveTheRowTo = (valueToWatch + " Certification");; 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getActiveCell(); 

    if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) { 
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo); 
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); 
    sheet.deleteRow(range.getRow()); 
    } 
} 

謝謝。

好吧,我已經更新了當前腳本:

function onUpdate() { 
    var sourceSheet = "Raw Data"; 
    var columnNumberToWatch = 17; // column A = 1, B = 2, etc. 
    var valueToWatch = ["Full", "Partial", "Process", "Conditional", "Fail", "Exemption"]; 
    var sheetNameToMoveTheRowTo = (valueToWatch + " Certification"); 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getActiveCell(); 

    if (sheet.getName() === sourceSheet && range.getColumn() === columnNumberToWatch && checkMatch(range.getValue(), valueToWatch) === true) { 
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo); 
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); 
    sheet.deleteRow(range.getRow()); 
     } 
} 

function checkMatch(value, array) { 
    for (i in array) { 
    if (value === array[i]) { 
     return(true); 
    } 
    } 
} 

好吧,

我想更多的指定一點吧:

function onEdit() { 
    var sourceSheet = "Raw Data"; 
    var columnNumberToWatch = 17; // column A = 1, B = 2, etc. 
    var valueToWatch = ["Full", "Partial", "Process", "Conditional", "Fail", "Exemption"]; 
    var sheetNameToMoveTheRowTo = (valueToWatch + " Certification"); 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var range = sheet.getActiveCell(); 
    var cert = range.getValue(); 

    if (valueToWatch.indexOf(cert) === sourceSheet && range.getColumn() === columnNumberToWatch && checkMatch(range.getValue(), valueToWatch) === true) { 
    var sheetNameToMoveTheRowTo = (cert + " Certification"); 
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo); 
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); 
    sheet.deleteRow(range.getRow()); 
     } 
} 

function checkMatch(value, array) { 
    for (i in array) { 
    if (value === array[i]) { 
     return(true); 
    } 
    } 
} 

通過定義證書,並試圖更清楚地定義valueToWatch的數組。

回答

0

您需要更改您的if語句。它應該是「===」而不是「==」。 Here是背後的一個很好的解釋。

下面是最終的腳本,您可以使用

function onEdit(e) { 
    var sourceSheet = "Raw Data"; 
    var columnNumberToWatch = 17; // column A = 1, B = 2, etc. 
    var valueToWatch = ["Full", "Partial", "Process", "Conditional", "Fail", "Exemption"]; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var range = e.range; 
    var activesheet = range.getSheet(); 
    var activesheetname = activesheet.getName(); 
    var row = range.getRow(); 
    var value = ss.getSheetByName(sourceSheet).getRange(row, columnNumberToWatch).getValue(); 

    if (activesheetname === sourceSheet && valueToWatch.indexOf(value) >=0) { 
    var targetSheet = ss.getSheetByName(value + " Certification"); 
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
    activesheet.getRange(row, 1, 1, activesheet.getLastColumn()).moveTo(targetRange); 
    activesheet.deleteRow(row); 
     } 
} 

更新 你不能讓第二表格運行的腳本,而無需手動編輯單元格。一旦該行在兩秒內從第一個電子表格中被推入,它將不會觸發第二個電子表格中的onEdit函數。你可以做的是設置它分配行從第一個電子表格正確的工作表像這樣

//This is part of a script on the first spreadsheet 
if (valueToWatch.indexOf(value) >=0) { 
     var targetSheetName = value + " Certification"; 
     } else { 
     var targetSheetName = "Raw Data"; 
     } 
     var targetSheet = SpreadsheetApp.openById("1bjLKWXUwM6UE4SHz2pbhH3F1E-8GKtvV0870YetOpKo").getSheetByName(targetSheetName); 
     var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1,1,activesheet.getLastColumn()); 
     targetRange.setValues(activesheet.getRange(row, 1, 1, activesheet.getLastColumn()).getValues()); 
     activesheet.deleteRow(row); 

    } 
+0

感謝您的答覆。我需要在第二個數組中定義數組還是值?我不會認爲[]應該識別數組。但是,沒有任何內容移動到相應的選項卡上。任何額外的想法? – baldalbino

+0

您是否設置了onEdit觸發器? –

+0

你可以調用你的函數onEdit()而不是onUpdate()。 –

相關問題