使用GAS将数据从工作表中的单元格移动到另一个工作表

时间:2013-08-01 21:44:54

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

我很难搞清楚这一点。我想从一个工作表中提取数据并将其复制到另一个Google表格中。首先,当我尝试使用getvalues时出现错误,之前没有发生过。此外,当我尝试将setValue用于“type”变量时,我收到错误。我试图从“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];

}

1 个答案:

答案 0 :(得分:5)

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

您遇到的错误是:

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

  2. 稍后,destLastRow = destSheet.getLastRow()会产生另一个号码。下一行有两个错误。第一个是将此数字视为数组destLastRow[0]

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

  4. 在此之下,var ID = destLastRow[1]重复错误#2。

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

    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...

    ,就会看到以下内容

    Screenshot w autocompletion

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

    另一方面,这是我们输入var dataValues = dataLastRow.时会发生的事情:

    enter image description here

    不多。编辑器没有为此类型Number提供的自动填充方法。如果您在编辑时调整了此行为,则可以避免以后可能具有较高PITA因子的许多简单错误。