使用Google Script复制文件后如何获取新Google Sheets文件的URL
Google Apps Script 遍历复制表格并写入链接解决方案
原代码核心问题
SpreadsheetApp.openById()要求传入文件ID,你传入的是自定义文件名,无法匹配到对应文件,因此触发权限报错。且copy()方法本身会返回新生成的表格对象,无需额外调用打开方法。sourceData是getValues()返回的普通二维数组,只有表格Range对象才支持setValue()方法,直接对数组元素调用该方法会触发语法错误。
修正后完整代码
function LoopSaveSend() { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var activeSheet = activeSpreadsheet.getSheetByName("4 Week Cycle"); var sourceSheet = activeSpreadsheet.getSheetByName("Log"); var lastSourceRow = sourceSheet.getLastRow(); var sourceData = sourceSheet.getRange(1, 1, lastSourceRow, sourceSheet.getLastColumn()).getValues(); // 遍历Log表每一行 for (let row = 0; row < sourceData.length; row++) { // 判断A列是否为X if (sourceData[row][0] == 'X') { // 写入初始值到指定命名区域 var tempvalue = sourceData[row][2]; activeSheet.getRange('rfInitials').setValue(tempvalue); // 获取要生成的文件名 var rffilename = activeSpreadsheet.getRange('rfFileName').getValue(); // 复制当前表格,直接获取新表格对象 var newSpreadsheet = activeSpreadsheet.copy(rffilename); // 获取新表格URL var newFileUrl = newSpreadsheet.getUrl(); // 写入URL到当前行E列(对应原逻辑的第5列) sourceSheet.getRange(row + 1, 5).setValue(newFileUrl); // 写入当前日期到当前行B列 sourceSheet.getRange(row + 1, 2).setValue(new Date()); // 清空A列的X标记 sourceSheet.getRange(row + 1, 1).setValue(""); } } // 立即提交所有变更 SpreadsheetApp.flush(); }
改动说明
- 省去了无效的
openById调用,直接接收copy()返回的新表格对象获取URL,从根源解决权限报错问题 - 所有写入操作都通过对应行的Range对象执行,匹配Apps Script的API规范
- 新增了当前日期写入对应行B列的逻辑,可通过
Utilities.formatDate()方法自定义日期显示格式 - 修复了原逻辑中数组索引和表格行号不匹配的问题,避免写错行
内容的提问来源于stack exchange,提问作者Jenny S.
相关产品推荐
相关产品推荐

