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

基于响应表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}`);
    }
  });
};

使用说明

  1. 替换脚本中的invoiceColumnIndex为你表单中发票上传字段对应的表格列索引(从1开始计数)
  2. 若表格公式生成Unique ID较慢,可适当延长Utilities.sleep(1000)中的数值(单位:毫秒)
  3. 首次运行createTrigger函数授权权限,之后表单提交时会自动执行格式复制与文件重命名
  4. 确保脚本拥有Google Drive文件的编辑权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:35:31