我在这里使用其他问题的答案做了一个简短的功能,但是它无法正常运行,我也不明白为什么!
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = e.source.getActiveSheet();
var r = e.source.getActiveRange();
if(s.getName() == "Input Expenses" && r.getColumn() == 14 && r.getValue() == "Verified") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Verified Expenses");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
想法是检查“已验证”,如果是,则将其移至“已验证费用”表。我希望这是一个完全独立的电子表格,因此我的数据输入表可以快速加载。如果您想知道的话,我也尝试过
openByID
。这是我为使其正常工作所做的更改:
function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = e.source.getActiveSheet();
var r = e.source.getActiveRange();
var t = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1R6YQAjV5G8JVzr2ecw6IZQFzC8J5KbzLImXOb6KGDIw/edit#gid=0");
if(s.getName() == "Input Expenses" && r.getColumn() == 14 && r.getValue() == "Verified") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = t.getSheetByName("Verified Expenses");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
我觉得这很容易被我忽略,因为我盯着它看了太久。
- 编辑 -
这是我作为手动功能而不是onEdit()运行时的执行记录
[15-05-27 12:28:50:192 EDT] Starting execution
[15-05-27 12:28:50:209 EDT] SpreadsheetApp.getActiveSpreadsheet() [0 seconds]
[15-05-27 12:28:50:244 EDT] Spreadsheet.getActiveSheet() [0.034 seconds]
[15-05-27 12:28:50:245 EDT] Spreadsheet.getActiveRange() [0 seconds]
[15-05-27 12:28:50:308 EDT] SpreadsheetApp.openByUrl([https://docs.google.com/spreadsheets/d/1R6YQAjV5G8JVzr2ecw6IZQFzC8J5KbzLImXOb6KGDIw/edit#gid=0]) [0.062 seconds]
[15-05-27 12:28:50:308 EDT] Sheet.getName() [0 seconds]
[15-05-27 12:28:50:308 EDT] Range.getColumn() [0 seconds]
[15-05-27 12:28:50:309 EDT] Sheet.getName() [0 seconds]
[15-05-27 12:28:50:309 EDT] Execution succeeded [0.1 seconds total runtime]
最佳答案
我相信我能够在模拟环境中解决此问题。
首先,当您访问其他SpreadSheets时,onEdit方法显然不起作用,因为它只应用于简单脚本。因此,您需要使用其他名称创建一个函数并将其作为触发器运行,如SpiderPig在问题注释中指出的那样。
除此之外,我相信moveTo函数应该只在同一个SpreadSheet中起作用,因此您必须使用另一种方法来实现,我使用了appendRow。
一个非常有用的地方来获取有关您在Google App脚本上所需的所有信息的信息:https://developers.google.com/apps-script/
这是我用来使其工作的脚本:
function Test(e) {
//Oficial
var s = e.source.getActiveSheet();
var r = e.range;
//Test
//var s = SpreadsheetApp.getActiveSheet(); //Gets active Sheet.
//var r = s.getRange(2, 1, 1, 2); //Gets first line after header.
var targetSheet = SpreadsheetApp.openById("15V0AvU84OBmN0nQweNyYczh5UfOTX77eECzu_1Um6Ug").getSheetByName("Verified Expenses");
//To View Logs, enter no View, Logs after the execution of the script
Logger.log(s.getName());
Logger.log(r.getColumn());
Logger.log(r.getValue());
if(s.getName() == "Input Expenses" && r.getColumn() == 1 && r.getValue() == "Verified") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var rangeToAdd = s.getRange(row, 1, 1, numColumns).getValues(); //Creates an Array[][], being the first dimension the rows and the second one the columns.
var rangeToAddFiltered = rangeToAdd[0]; //Get the first row of the array (as we will only check one by one).
targetSheet.appendRow(rangeToAddFiltered); //Append the Row to the new SpreadSheet (moveTo appears to work only inside the same SpreadSheet).
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.deleteRow(row); //Profit!
}
}
不要忘了在当前项目的“资源”触发器的onEdit触发器上添加Test(e)。
希望对您有帮助。
更新:
如果这仍然不能解决您的问题,则可能是您遇到了一些权限问题(第一次运行脚本时,会弹出一个窗口,询问该脚本更改电子表格的权限)。可能的替代方法是强制在固定范围内进行伪事件,以便能够调试函数以查看发生了什么。我在上面的脚本中添加了一些注释行,如果未注释,则可以完全通过脚本界面运行该脚本以进行测试/调试。
关于javascript - Google表格在单独的电子表格之间移动行不起作用,但表格之间却行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30470601/