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
相关产品推荐
相关产品推荐

