我有一个简短的功能,我在这里使用其他问题的答案,但它没有完美的工作,我不明白为什么!
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]
答案 0 :(得分:1)
我相信我能够在模拟环境中解决这个问题。
首先,当您访问其他SpreadSheets时,onEdit方法显然不起作用,因为它应该仅用于简单脚本。因此,您需要创建一个具有其他名称的函数,并将其作为SpiderPig在您的问题的评论中指出的触发器运行。
除此之外,我相信moveTo函数应该只在同一个SpreadSheet中工作,所以你必须使用另一种方法来做到这一点,我已经使用了appendRow函数。
获取Google App Scripts所需信息的非常有用的地方就是: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触发器上添加测试(e)。
我希望它可以帮到你。
<强>更新强>
如果这对您仍然没有帮助,可能您会遇到一些权限问题(第一次运行脚本会弹出一个窗口,询问脚本更改电子表格的权限)。也许另一种方法是在固定范围内强制执行假事件,以便能够调试函数以查看正在发生的事情。我在上面的脚本中添加了一些注释行,如果没有注释,可以用来完全通过脚本界面运行脚本以进行测试/调试。