【问题标题】:Move data from cells in worksheet to another sheet using GAS使用 GAS 将数据从工作表中的单元格移动到另一个工作表
【发布时间】:2013-08-01 21:44:54
【问题描述】:

我很难弄清楚这一点。我想从一个工作表中提取数据并将其复制到另一个 Google 工作表中。首先,当我尝试使用 getvalues 时出现错误,这在以前没有发生过。另外,当我尝试将 setValue 用于我的“类型”变量时,我遇到了错误。我正在尝试从“sourceCC”中获取数据并将其放入“destSS”中的各个单元格中。任何帮助将不胜感激。

function sendData() {

  var sourceSS = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = sourceSS.getSheetByName("Data");
  var dataLastRow = dataSheet.getLastRow();
  var dataValues = dataLastRow.getRange("A"+(dataLastRow)+":G"+(dataLastRow)).getValues();

  var emailSheet = sourceSS.getSheetByName('Emails');
  var recipient = emailSheet.getRange('B2:B22').getValues();
  var orgUnit = emailSheet.getRange('A2:A22').getValues();


  var destSS = SpreadsheetApp.openById('SHEETID');
  var destSheet = destSS.getSheetByName('Sheet1');
  var destLastRow = destSheet.getLastRow();
  var type = destLastRow[0].setValue('NEW');
  var ID = destLastRow[1];

}

【问题讨论】:

  • destSheet.getLastRow() 是一个整数(最后一行的张数),您无法按照您的方式处理它。您想要达到的结果究竟是什么?您想复制在目标表末尾获得的值吗?你希望它们如何被复制?你能更“描述性”吗?
  • @Sergeinsas 感谢您的澄清。我想获取在“sourceSS”电子表格中收集的数据,如果“E”列是“是”,则发送“数据”表上最后一行 B、C、D、G 列中的数据,连同“电子邮件”工作表上的 B 中的字符串(此处选择的内容取决于“数据”表的 G 中的内容)到“destSS”中的最后一行和特定列。我希望这是有道理的。

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


【解决方案1】:

在 Javascript(因此在 Google Apps 脚本中)中,只有在目标对象“具有”该方法时才能调用该方法。您收到错误是因为您混淆了一些对象 - 对象类型不支持您正在使用的方法。 (同意 Serge 的评论!)

您遇到的错误是:

  1. 在第三行代码中,dataLastRow = dataSheet.getLastRow() 产生一个数字,然后您尝试dataLastRow.getRange()。但是,.getRange() 是一个 Sheet 方法。

  2. 稍后,destLastRow = destSheet.getLastRow() 生成另一个数字。下一行有两个错误。首先是这个Number被当作一个Array,destLastRow[0]

  3. 该行中的第二个错误是在未定义的值上调用 Range.setValue()。 (未定义,因为数组索引不正确。)

  4. 就在其下方,var ID = destLastRow[1] 重复错误 #2。

此编辑版本删除了这些错误。它可能在逻辑上有其他错误,它肯定不完整,但它运行。添加了注释以显示每个语句返回的对象类型。

function sendData() {

  var sourceSS = SpreadsheetApp.getActiveSpreadsheet();      //= Spreadsheet
  var dataSheet = sourceSS.getSheetByName("Data");           //= Sheet
  var dataLastRow = dataSheet.getLastRow();                  //= Number
  var dataValues = dataSheet.getRange("A"+(dataLastRow)+":G"+(dataLastRow)).getValues();
                                                             //= Array [[]]

  var emailSheet = sourceSS.getSheetByName('Emails');        //= Sheet
  var recipient = emailSheet.getRange('B2:B22').getValues(); //= Array [[]]
  var orgUnit = emailSheet.getRange('A2:A22').getValues();   //= Array [[]]

  var destSS = SpreadsheetApp.openById('SHEETID');           //= Spreadsheet
  var destSheet = destSS.getSheetByName('Sheet1');           //= Sheet
  var destLastRow = destSheet.getLastRow();                  //= Number
  var type = destSheet.getRange(destLastRow, 0);             //= Range
  type.setValue('NEW');                                      //= Range (for chaining)
  var ID = destSheet.getRange(destLastRow, 1);               //= Range

}

自动完成作为一种缺陷删除工具

在这种情况下,Apps 脚本编辑器的自动完成功能是您的朋友。当编辑器能够确定您正在处理的对象类型时,它将提供支持的方法列表。如果您开始输入var dataValues = dataSheet.getR...,您会看到以下内容:

只要您输入.,编辑器就会提供一长串方法。随着输入的字符越多,列表越短 - 此时您会看到各种 Sheet.getRange() 方法。

另一方面,当我们输入 var dataValues = dataLastRow. 时会发生以下情况:

不多。编辑器没有为这种类型提供自动完成方法,Number。如果您在编辑时调整到此行为,则可以避免许多简单的错误,这些错误可能会在以后产生较高的 PITA 系数。

【讨论】:

  • 感谢您花时间向我解释。你和 Serge 在帮助我理解 Javascript/GAS 方面做得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多