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

使用Google Apps Script提取云端Excel文件数据遇错求助

问题分析与解决方案

核心问题

你的代码存在两个关键问题导致报错:

  1. Excel转Google Sheets的方式错误:直接用DriveApp.createFile(blob)无法可靠完成格式转换,且你定义的config参数完全没被使用,无法指定转换后的文件属性。
  2. 文件转换延迟未处理:Excel转Google Sheets需要后台处理时间,创建文件后立即调用SpreadsheetApp.openById会因文件未完成转换而抛出错误。

解决步骤

1. 启用高级Drive服务

在Google Apps Script编辑器中:

  • 点击菜单栏的「服务」→「添加服务」
  • 找到「Drive API」,点击添加并保存

2. 修正代码

以下是修复后的代码,包含格式转换、延迟处理和临时文件清理:

function readExcelFromDrive(file_id='1_m2AR8UVOpn9XABPz_WvyPkLzz9OgyPs', debug=true) {  
  // 获取源Excel文件
  let file = DriveApp.getFileById(file_id);
  if(debug) console.log(`File ${file_id} found: ${file.getName()}`);
  
  let blob = file.getBlob();
  let parentFolderId = file.getParents().next().getId();
  
  // 配置转换后的Google Sheets属性
  let fileResource = {
    title: "[Auto Generated Google Sheets] " + file.getName(),
    parents: [{id: parentFolderId}],
    mimeType: MimeType.GOOGLE_SHEETS
  };
  
  // 使用Drive API完成Excel到Google Sheets的转换
  let spreadsheet = Drive.Files.insert(fileResource, blob, {
    convert: true
  });
  if(debug) console.log(`Converted spreadsheet created. Id: '${spreadsheet.id}'`);
  
  // 等待文件转换完成(最多等待10秒)
  let waitTime = 0;
  let maxWait = 10000; // 10秒
  let ss;
  while(waitTime < maxWait) {
    try {
      ss = SpreadsheetApp.openById(spreadsheet.id);
      break;
    } catch(e) {
      Utilities.sleep(1000);
      waitTime += 1000;
      if(debug) console.log(`Waiting for conversion... ${waitTime/1000}s`);
    }
  }
  
  if(!ss) {
    console.error("File conversion timed out");
    Drive.Files.remove(spreadsheet.id); // 删除未完成的临时文件
    return;
  }
  
  // 读取数据
  let data = ss.getActiveSheet().getDataRange().getValues();
  if(debug) console.log(data);
  
  // 可选:删除临时转换的Google Sheets文件
  Drive.Files.remove(spreadsheet.id);
  if(debug) console.log("Temporary spreadsheet deleted");
  
  return data;
}

额外说明

  • 代码中加入了超时等待逻辑,避免因转换延迟导致的打开失败;
  • 完成数据读取后自动删除临时转换文件,避免Drive空间占用;
  • 利用Drive.Files.insert的convert: true参数确保Excel文件被正确转换为Google Sheets格式;
  • 如果源文件存在于多个文件夹中,getParents().next()会抛出错误,可根据需求修改为指定固定文件夹ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:59:58