Google Apps 脚本 - 将一行数据从一个电子表格移动到另一个电子表格

Posted

技术标签:

【中文标题】Google Apps 脚本 - 将一行数据从一个电子表格移动到另一个电子表格【英文标题】:Google Apps Script - move a row of data from one spreadsheet to another 【发布时间】:2020-05-21 21:35:39 【问题描述】:

我是 javascript 和 google 应用程序脚本领域的新​​手,我正在努力将一行数据从一个电子表格转移到另一个电子表格。我让它在同一个电子表格中的工作表之间移动一行,而不是跨电子表格。

我知道我需要使用 SpreadsheetApp.openById("insertID") 而不是 SpreadsheetApp.getActiveSpreadsheet() 但我似乎无法让它工作。

这是基于将工作表移动到工作表的代码,如何修改它以移动到新的电子表格?

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

  if(s.getName() == "Timeline Submit" && r.getColumn() == 117 && r.getValue() == true) 
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("WIP");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target, contentsOnly:true);
       else if(s.getName() == "WIP" && r.getColumn() == 117 && r.getValue() == false) 
    var row = r.getRow();
        var numColumns = s.getColumn();
    var targetSheet = ss.getSheetByName("Timeline Submit");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo(target, contentsOnly:true);
      

【问题讨论】:

看看this 您需要使用可安装的触发器。 您是否希望每次在源电子表格中编辑单元格时自动移动数据行?或者通过从编辑器(或使用 UI 菜单按钮)手动运行该功能?另外,请注意,您需要目标电子表格 ID 才能执行您想要执行的操作。 @AndresDuarte 是的,当单元格值设置为 TRUE 时,我希望它触发行移动到新电子表格 请提供一个示例/复制电子表格以了解您要查找的行为(您要在哪个工作表和行中复制该行,哪个是源工作表等),删除当然是私人信息。 【参考方案1】:

我无法弄清楚代码第二部分中的所有内容,但它有太多错误,所以我只是猜测了一些。

不要忘记在脚本编辑器编辑/当前项目触发器中为此创建触发器。

function installableOnEdit(e) 
  var sh=e.range.getSheet();
  if(sh.getName()=="Timeline Submit" && e.range.columnStart==117 && e.value==true) 
    var ss=SpreadsheetApp.openById('id')
    var tsh= ss.getSheetByName("WIP");
    var trg=tsh.getRange(tsh.getLastRow()+1,1);
    sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).copyTo(trg,contentsOnly:true)
  else if(sh.getName()=="WIP" && e.range.columnStart==17 && e.value==false) 
    var ss=SpreadsheetApp.openById('id')
    var tsh=ss.getSheetByName('Timeline Submit');
    var trg=sh.getRange(tsh.getLastRow()+1,1);
    sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).copyTo(trg,contentsOnly:true);
  

【讨论】:

感谢 Cooper,不幸的是,该代码抛出错误“无法从未定义中读取属性“范围”。(第 2 行,文件“代码”)” 您在我看来似乎错过了事件对象。我希望您意识到无法从脚本编辑器运行 onEdit 函数。它需要从事件触发器获取的事件对象。所以我总是在它们运行时调试这些东西。 我将尝试详细说明 Coopers 的答案。您面临 2 个问题:1)不同的代码,Cooper 提供了一个示例 2)访问范围。对于简单的 onEdit 触发器,您无法访问其他工作表或执行许多其他花哨的操作,例如调用 urlfetch、访问驱动器、发送电子邮件等。因为为此您需要授予应用程序访问 gmail 帐户的权限。这就是您使用可安装触发器的原因。它的作用类似于普通的 onEdit 触发器,但您必须使用 Script Editor Edits/Current Project Triggers 手动安装它,就像 Cooper 提到的那样。

以上是关于Google Apps 脚本 - 将一行数据从一个电子表格移动到另一个电子表格的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本:Google 表格分组

有没有办法在仅附加模式下使用 Google Apps 脚本将数据从 BigQuery 加载到 Google 表格?

将关联数组转换为数字以在Apps脚本中写入工作表

无法通过 Google Apps 脚本中的 YouTube 数据 API 从云端硬盘上传:空响应

无法通过 Google Apps 脚本中的 YouTube 数据 API 从云端硬盘上传:空响应

当 Zapier 添加一行时,Google Apps 脚本 onEdit 触发器未触发 [重复]