【问题标题】:Write remotely to another googlesheet远程写入另一个谷歌表
【发布时间】:2020-05-19 19:31:08
【问题描述】:

下面的函数是我从其他地方复制的。它基本上将您已经完成的一行移动到同一文件中的另一张表(从表原点移动到目标,触发器是“移动”)。

我想要实现的是能够将完成的行移动到另一个谷歌工作表文件,而不是同一个文件中的另一个工作表。我已经尝试过 SpreadsheetApp.openByUrl 和 SpreadsheetApp.openByID,但没有任何反应,我期待一些权限请求等,但什么也没有,甚至没有错误。 有人可以帮我弄这个吗?

function onEdit(event) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Origin" && r.getColumn() == 10 && r.getValue() == "Move") {

    var row = r.getRow();
    var numColumns = s.getLastColumn();

    var targetSheet = ss.getSheetByName("Target");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, (numColumns-1)).moveTo(target);
    s.deleteRow(row);

  }

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我相信你的目标如下。

    • 您想将s.getRange(row, 1, 1, (numColumns-1)) 的值复制到其他电子表格中Target 工作表的最后一行。
    • 您想通过 OnEdit 事件触发器运行脚本。

    对于这个,这个答案怎么样?

    修改点:

    • 为了使用SpreadsheetApp.openByUrlSpreadsheetApp.openByID,需要使用可安装的OnEdit事件触发器,而不是OnEdit事件触发器的简单触发器。使用简单触发器运行SpreadsheetApp.openByUrlSpreadsheetApp.openByID 时,会出现与权限相关的错误。
      • 我认为您的问题的原因是这个。
    • 将值移动到其他电子表格时,无法使用move()。所以在本例中,使用了getValuessetValues

    当以上几点反映到你的脚本中时,它变成如下。

    修改脚本:

    请复制并粘贴以下脚本。还有,please install the OnEdit event trigger to the function of installedOnEdit as the installable trigger。这样,当编辑单元格时,SpreadsheetApp.openById 就会运行。

    function installedOnEdit(event) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var s = event.source.getActiveSheet();
      var r = event.source.getActiveRange();
      if(s.getName() == "Origin" && r.getColumn() == 10 && r.getValue() == "Move") {
    
        var id = "###";  // Please set the Spreadsheet ID.
    
        var dst = SpreadsheetApp.openById(id);
        var targetSheet = dst.getSheetByName("Target");
        var row = r.getRow();
        var numColumns = s.getLastColumn();
        var srcRange = s.getRange(row, 1, 1, (numColumns-1));
        s.deleteRow(row);
        targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, numColumns - 1).setValues(srcRange.getValues());
      }
    }
    

    参考资料:

    【讨论】:

    • 非常感谢您的回答。你的问题是对的。我应用了代码并安装了触发器。 a第一部分正在工作,即该行被删除,但它似乎没有移动到目标表,我只是找不到它,我刷新了等等。没有结果。我需要在目标表(目标?)设置权限或其他什么吗?
    • @didine 感谢您的回复。我带来的不便表示歉意。不幸的是,我无法复制您的问题。因为在我的环境中,我可以确认脚本有效。这是因为我的技术不好。我对此深表歉意。关于授权,在安装触发器时,如果您从未授权,当显示授权屏幕时,请授权。在目标端,不需要授权。如果您没有访问目标电子表格的权限,则会发生错误。这个怎么样?
    • 由于某种原因,当我在 openById(ID) 中使用实际 ID 而不是将其定义为变量然后使用该变量时,它起作用了。无论如何,它成功了!非常感谢!!
    • @didine 感谢您再次回复和测试。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2020-12-07
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多