You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheet脚本复制特定范围报错:getRange不是函数

问题分析与修正方案

错误原因

你报错的核心问题出在这行代码:

var copiedSheet = sheet.copyTo(newSS).getRange("A1:F52");

sheet.copyTo(newSS)会把整个工作表复制到新文档,返回的是复制后的Sheet对象——虽然Sheet确实有getRange()方法,但你后续对copiedSheet调用setName()时,copiedSheet已经变成了Range(单元格范围)对象,而Range根本没有setName()方法,这才是触发错误的根源。更重要的是,这种写法完全没实现你“只复制A1:F52”的需求,它还是复制了整个工作表,只是后续取了个范围而已。

正确修改方式

要只复制特定范围到新文档,你需要先在新文档里准备好工作表,再把原表的目标范围复制过去,而不是复制整个工作表。具体修改如下:

替换原代码中从var copiedSheet = ...到newSS.deleteSheet(...)的部分,改成:

// 获取原表的目标范围
var sourceRange = sheet.getRange("A1:F52");
// 获取新文档里的默认Sheet1,重命名为目标名称
var targetSheet = newSS.getSheetByName('Sheet1');
targetSheet.setName(sheet_name);

// 把原表的目标范围复制到新表的对应位置
sourceRange.copyTo(targetSheet.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_ALL, false);

// (可选)如果需要只复制值,把上面的copyTo改成:
// sourceRange.copyTo(targetSheet.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

修改后的完整脚本

// SAVE INVOICE
function copyRowsWithCopyTo() {

  // SET VALUES IN CELL
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A1:F60').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('F3'));
  spreadsheet.getRange('A1:F60').copyTo(spreadsheet.getActiveRange(), 
    SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  //COPY CONTENTS TO INVOICE SHEET
  let spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  let sourceSheet = spreadSheet.getSheetByName('DO NOT EDIT');


  // SET SPREADSHEET MONTH
  let targetSheet = spreadSheet.getSheetByName('JANUARY 2023');
  let row = sourceSheet.getActiveRange().getRow();
  let activeRow = sourceSheet.getRange( 2,1,1,20);
  let last_row = targetSheet.getLastRow();
   
  activeRow.copyTo(targetSheet.getRange('A'+(last_row+1)+':H'+(last_row+1)),{contentsOnly:true});


  // REPLICATE INVOICE SHEET TO NEW DOCUMENT AND SAVE IN INVOICE FOLDER
  var sheet = SpreadsheetApp.getActiveSheet(); // Get current active sheet.

  //GET SHEET NAME
  var sheet_name1 = sheet.getRange("F4").getValue(); // Get the value of cell F4, used to name the new spreadsheet.
  var sheet_name2 = " - "
  var sheet_name3 = sheet.getRange("A9").getValue(); // Get the value of cell A9, used to name the new spreadsheet.
  var sheet_name = sheet_name1 + sheet_name2 + sheet_name3
  var folder = DriveApp.getFolderById("1DVdganPrCfePk41kteKnXSqKmL4Pivu5"); 
  
  // Get the ID of the folder where you will place a copy of the spreadsheet.
  var newSS = SpreadsheetApp.create(sheet_name); // create new blank spreadsheet in a root folder
  var asFile = DriveApp.getFileById(newSS.getId()); // get new spreadsheet as a file

  folder.addFile(asFile); // add this file to destination folder
  DriveApp.getRootFolder().removeFile(asFile); // remove a file from root folder

  // --- 以下是修改后的代码 ---
  // 获取原表要复制的特定范围
  var sourceRange = sheet.getRange("A1:F52");
  // 操作新文档的默认Sheet1
  var targetSheet = newSS.getSheetByName('Sheet1');
  // 重命名工作表
  targetSheet.setName(sheet_name);
  // 复制原范围到新表的A1起始位置
  sourceRange.copyTo(targetSheet.getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_ALL, false);

  // run Clear function
  clear()
}

补充说明

  • 如果只需要复制单元格的值(不需要格式、公式等),把copyTo里的PASTE_ALL改成PASTE_VALUES即可。
  • 原代码里的newSS.deleteSheet(newSS.getSheetByName('Sheet1'))已经不需要了,因为我们直接修改了默认的Sheet1,没有额外复制整个工作表,也就不需要删除它了。

内容的提问来源于stack exchange,提问作者Matthew Hughes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:20:37