Google表格在单独的电子表格之间移动行不起作用但在工作表之间移动

时间:2015-05-26 23:20:19

标签: javascript google-apps-script google-sheets

我有一个简短的功能,我在这里使用其他问题的答案,但它没有完美的工作,我不明白为什么!

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]

1 个答案:

答案 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)。

triggers

我希望它可以帮到你。

<强>更新

如果这对您仍然没有帮助,可能您会遇到一些权限问题(第一次运行脚本会弹出一个窗口,询问脚本更改电子表格的权限)。也许另一种方法是在固定范围内强制执行假事件,以便能够调试函数以查看正在发生的事情。我在上面的脚本中添加了一些注释行,如果没有注释,可以用来完全通过脚本界面运行脚本以进行测试/调试。