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

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();
}

问题分析

  1. 获取目标文件夹错误:DriveApp.getFoldersByName(valu)返回的是FolderIterator对象,并非文件夹ID,直接传给DriveApp.getFolderById()会触发参数类型错误。
  2. 文件夹函数返回值缺失:当文件夹已存在时,getLinkFrFolderName_函数未返回文件夹URL,会导致newLink为undefined,超链接设置失效。
  3. 冗余变量定义:主函数中重复定义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; // 无论文件夹是新建还是已存在,都返回文件夹对象
}

修正说明

  1. 返回文件夹对象而非URL:修改文件夹函数逻辑,直接返回文件夹对象,避免重复查询操作,同时确保所有分支都有返回值。
  2. 修复文件夹获取逻辑:主函数直接使用修正后的函数返回的文件夹对象,跳过错误的ID查询步骤。
  3. 优化代码结构:删除冗余变量,添加空值判断,提升代码健壮性与可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:25:02