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

Google Apps Script导入CSV至表格时遇SpreadsheetApp.openById错误

问题描述

脚本已成功从带zoho-deal-stage标签的邮件中提取CSV附件,上传并转换为Google表格文件存入指定Drive文件夹,但在执行var attached_gs = SpreadsheetApp.openById(fileid);时触发错误:

Exception: Unexpected error while getting the method or property openById on object SpreadsheetApp

即使将fileid替换为实际文件ID字符串,错误依然存在。

原因分析
  1. 异步转换延迟:Drive.Files.insert的convert: true是异步执行的,文件上传后立即调用openById时,CSV可能还未完成向Google表格格式的转换,此时文件无法被SpreadsheetApp识别。
  2. 冗余转换步骤:实际上无需将CSV转换为Google表格再读取,直接解析CSV内容写入目标表格更高效,也能避免转换延迟问题。
解决方案

推荐直接解析CSV附件内容,跳过Drive转换步骤,代码修改如下:

var fileTypesToExtract = ['csv', 'xlsx'];

function file_type(attachment){
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length-1].toLowerCase();
  return fileTypesToExtract.indexOf(fileExtension) !== -1;
}

function VendorToDrive(){
  // 目标表格配置
  var targetSheetId = "1fraXrYZ7NL4wGP_FXU8n2V-0jAYE0G8IqB5lfqVr0RA";
  var targetSpreadsheet = SpreadsheetApp.openById(targetSheetId);
  var targetSheet = targetSpreadsheet.getSheetByName("Deal Stage");
  var targetData = targetSheet.getDataRange().getValues();

  // 搜索目标邮件
  var query = 'label:zoho-deal-stage';
  var threads = GmailApp.search(query);
  
  processAttachments(threads, targetSheet, targetData);
}

function processAttachments(threads, targetSheet, targetData) {
  if (threads.length === 0) return;
  
  var latestMsg = threads[0].getMessages()[0]; // 获取最新邮件
  var attachments = latestMsg.getAttachments();

  for (var k = 0; k < attachments.length; k++) {
    var attachment = attachments[k];
    // 过滤文件类型和目标文件名
    if (!file_type(attachment) || attachment.getName() !== 'ID_Deal_Stage_Report.csv') {
      continue;
    }

    // 直接解析CSV内容
    var csvContent = attachment.getDataAsString();
    var csvData = Utilities.parseCsv(csvContent);

    // 清空目标表格并写入新数据
    targetSheet.getRange(1, 1, targetData.length, targetData[0].length).clear();
    targetSheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

    // 可选:将原始附件保存到Drive(无需转换)
    var targetFolder = DriveApp.getFolderById('1sCtaxcbelLl1OSten_hiJX5JuY95IiCl');
    targetFolder.createFile(attachment.copyBlob());
  }
}

关键修改点

  • 移除Drive转换Google表格的步骤,用attachment.getDataAsString()直接读取CSV内容,通过Utilities.parseCsv解析为可直接写入表格的二维数组,彻底避免转换延迟问题。
  • 优化循环逻辑,提前过滤非目标文件,减少无效处理。
  • 将目标表格参数传入处理函数,提升代码可读性。

如果必须保留转换为Google表格的需求,可添加重试等待机制:

// 在Drive.Files.insert后添加重试逻辑
file = Drive.Files.insert(file, attachmentBlob, { "convert": true });
var fileid = file.getId();

var maxAttempts = 5;
var attempt = 0;
var attached_gs;
while (attempt < maxAttempts) {
  try {
    attached_gs = SpreadsheetApp.openById(fileid);
    break;
  } catch (e) {
    attempt++;
    Utilities.sleep(2000); // 每次重试等待2秒
  }
}
if (!attached_gs) throw new Error("文件转换超时,无法打开");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:03:17