基于响应表Unique ID重命名表单上传文件的脚本需求
表单上传文件自动重命名为表格Unique ID方案
需求概述
- 制作费用表单,实现上传的发票文件自动重命名为响应电子表格A列自动生成的Unique ID(该ID由表格内置公式生成)
- 已使用基于
onFormSubmit触发器的脚本自动格式化新表单条目,需兼容现有逻辑,避免触发冲突
现有格式设置脚本
/** * @OnlyCurrentDoc */ const createTrigger = () => { // 删除现有所有触发器,避免重复 ScriptApp.getProjectTriggers().forEach((trigger) => { ScriptApp.deleteTrigger(trigger); }); // 创建新的表单提交触发器 ScriptApp.newTrigger('formRowOnFormSubmit').forSpreadsheet(SpreadsheetApp.getActive()).onFormSubmit().create(); }; const formRowOnFormSubmit = (e) => { if (!e) { throw new Error('请勿手动运行此函数!'); } const { range } = e; const row = range.getRowIndex(); if (row > 2) { const sheet = range.getSheet(); // 选中上一行的范围 const sourceRange = sheet.getRange(`${row - 1}:${row - 1}`); // 获取新增的表单行 const targetRange = sheet.getRange(`${row}:${row}`); // 仅复制上一行格式到当前行 sourceRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); } };
兼容的文件重命名实现脚本
将重命名逻辑合并到现有触发器函数中,避免多触发器冲突:
/** * @OnlyCurrentDoc */ const createTrigger = () => { // 删除现有所有触发器,避免重复 ScriptApp.getProjectTriggers().forEach((trigger) => { ScriptApp.deleteTrigger(trigger); }); // 创建新的表单提交触发器 ScriptApp.newTrigger('formRowOnFormSubmit').forSpreadsheet(SpreadsheetApp.getActive()).onFormSubmit().create(); }; const formRowOnFormSubmit = (e) => { if (!e) { throw new Error('请勿手动运行此函数!'); } const { range } = e; const row = range.getRowIndex(); const sheet = range.getSheet(); // 1. 执行原有格式复制逻辑 if (row > 2) { const sourceRange = sheet.getRange(`${row - 1}:${row - 1}`); const targetRange = sheet.getRange(`${row}:${row}`); sourceRange.copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false); } // 2. 新增发票文件重命名逻辑 // 等待公式生成Unique ID(公式计算可能存在延迟) Utilities.sleep(1000); const uniqueId = sheet.getRange(`A${row}`).getValue(); if (!uniqueId) { console.log('Unique ID未生成,跳过重命名'); return; } // --- 请根据实际情况修改此处的列索引 --- const invoiceColumnIndex = 6; // 示例:第6列为发票上传对应的表格列(从1开始计数) // ----------------------------------- const fileUrls = sheet.getRange(row, invoiceColumnIndex).getValue(); if (!fileUrls) { console.log('未检测到上传文件,跳过重命名'); return; } // 处理多文件上传的情况 const urlArray = fileUrls.split(', '); urlArray.forEach(url => { try { // 从文件链接中提取文件ID const fileId = url.match(/[-\w]{25,}/)[0]; const file = DriveApp.getFileById(fileId); // 获取文件扩展名(保持原格式) const fileExtension = file.getBlob().getContentType().split('/')[1]; const newFileName = `${uniqueId}.${fileExtension}`; // 重命名文件 file.setName(newFileName); console.log(`文件已成功重命名:${newFileName}`); } catch (error) { console.log(`文件重命名失败:${error.message}`); } }); };
使用说明
- 替换脚本中的
invoiceColumnIndex为你表单中发票上传字段对应的表格列索引(从1开始计数) - 若表格公式生成Unique ID较慢,可适当延长
Utilities.sleep(1000)中的数值(单位:毫秒) - 首次运行
createTrigger函数授权权限,之后表单提交时会自动执行格式复制与文件重命名 - 确保脚本拥有Google Drive文件的编辑权限
内容的提问来源于stack exchange,提问作者Ankur Mathur
相关产品推荐
相关产品推荐

