我在这里使用其他问题的答案做了一个简短的功能,但是它无法正常运行,我也不明白为什么!

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/

10-12 12:20
查看更多