Google Script技术问题:无法将表格副本移入新建文件夹
Google Script 脚本问题:无法将当前表格副本移入新建文件夹
需求说明
- 基于F8单元格的值创建文件夹——已实现
- 在另一工作表中添加该文件夹的超链接——已实现
- 创建当前运行脚本的表格副本并移入新建文件夹——未实现
原代码
主函数
function foler() { const parent = DriveApp.getFolderById("1hEjlSMhyvKCuL5Pot-FF80-37IKjcIjd"); var vs = SpreadsheetApp.getActiveSheet(); var value = vs.getRange("F8").getValue(); var sss = SpreadsheetApp.openById('1Gu8NjKdqfrxtxdXJX00UzexgCuVB75QaKdGqjix2yUY'); const sh = sss.getSheetByName('Estimator Quoting'); var aValues = sh.getRange("A1:A").getValues(); var aLast = aValues.filter(String).length; // Consider checking if this r & c has a formula in the equal size array from getFormulas() if(value) { var newLink = getLinkFrFolderName_(parent, value); // Use the current array index to write this formula in only the correct cell. sh.getRange('A' + (aLast + 1)).setFormula("HYPERLINK(\"" + newLink + "\", \"" + value + "\")" ); var file = SpreadsheetApp.getActiveSpreadsheet().getId(); var vs = SpreadsheetApp.getActiveSheet(); var valu = vs.getRange("F8").getValue(); var folders = DriveApp.getFoldersByName(valu); var destFolder = DriveApp.getFolderById(folders); DriveApp.getFileById(file).makeCopy("Frame, Truss and Take off", destFolder); }
创建文件夹函数
function getLinkFrFolderName_(root, name) { var folder; const search = root.getFoldersByName(name); if (search.hasNext()) { folder = search.next(); if (search.hasNext()) console.warn("Multiple folders named '" + name + "' in root folder '" + root.getName() + "'"); } else { folder = root.createFolder(name); ["Quotes", "Plans"].forEach(function(e) { folder.createFolder(e); }); return folder.getUrl(); }
问题分析
- 获取目标文件夹错误:
DriveApp.getFoldersByName(valu)返回的是FolderIterator对象,并非文件夹ID,直接传给DriveApp.getFolderById()会触发参数类型错误。 - 文件夹函数返回值缺失:当文件夹已存在时,
getLinkFrFolderName_函数未返回文件夹URL,会导致newLink为undefined,超链接设置失效。 - 冗余变量定义:主函数中重复定义
vs变量,属于无效代码。
修正后的代码
主函数
function foler() { const parent = DriveApp.getFolderById("1hEjlSMhyvKCuL5Pot-FF80-37IKjcIjd"); const activeSheet = SpreadsheetApp.getActiveSheet(); const folderName = activeSheet.getRange("F8").getValue(); const targetSpreadsheet = SpreadsheetApp.openById('1Gu8NjKdqfrxtxdXJX00UzexgCuVB75QaKdGqjix2yUY'); const targetSheet = targetSpreadsheet.getSheetByName('Estimator Quoting'); if (!folderName) return; // F8为空则终止执行 // 获取目标文件夹对象 const targetFolder = getFolderFrFolderName_(parent, folderName); // 写入超链接到目标工作表 const lastRow = targetSheet.getRange("A1:A").getValues().filter(String).length + 1; targetSheet.getRange(`A${lastRow}`).setFormula(`HYPERLINK("${targetFolder.getUrl()}", "${folderName}")`); // 复制当前表格到目标文件夹 const currentFile = SpreadsheetApp.getActiveSpreadsheet(); currentFile.makeCopy("Frame, Truss and Take off", targetFolder); }
创建/获取文件夹函数
function getFolderFrFolderName_(root, name) { let folder; const folderIterator = root.getFoldersByName(name); if (folderIterator.hasNext()) { folder = folderIterator.next(); if (folderIterator.hasNext()) { console.warn(`存在多个名为'${name}'的文件夹,位于根文件夹'${root.getName()}'下`); } } else { folder = root.createFolder(name); ["Quotes", "Plans"].forEach(subFolderName => folder.createFolder(subFolderName)); } return folder; // 无论文件夹是新建还是已存在,都返回文件夹对象 }
修正说明
- 返回文件夹对象而非URL:修改文件夹函数逻辑,直接返回文件夹对象,避免重复查询操作,同时确保所有分支都有返回值。
- 修复文件夹获取逻辑:主函数直接使用修正后的函数返回的文件夹对象,跳过错误的ID查询步骤。
- 优化代码结构:删除冗余变量,添加空值判断,提升代码健壮性与可读性。
内容的提问来源于stack exchange,提问作者banksie
相关产品推荐
相关产品推荐

