2015-05-14 32 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()。 –

相关问题