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

修改MimeType为MICROSOFT_EXCEL后Spreadsheets服务异常排查求助

问题原因分析

你遇到的错误直接原因是:

  • 当指定MimeType.MICROSOFT_EXCEL时,Drive.Files.insert创建的是**Excel格式(.xlsx)**的文件
  • 而SpreadsheetApp.openById()只能操作Google原生的Sheets文件,无法读取Excel格式的文件,因此抛出"无法访问文档"的异常
解决方案

根据你的实际需求选择对应方案:

方案1:无需生成Excel文件(推荐)

你的代码逻辑是读取附件数据后就删除转换后的文件,完全没必要转成Excel。直接保留原来的MimeType.GOOGLE_SHEETS转换逻辑即可,这也是最稳定的方式。

方案2:必须生成Excel文件且读取数据

如果确实需要生成Excel文件,同时要读取其中的数据,需要先上传Excel文件,再将其转换为临时Google Sheets文件来读取数据,最后删除两个文件。修改核心代码如下:

// 原出错代码段替换为:
// 1. 先将附件保存为Excel文件到Drive
var excelFile = Drive.Files.insert({mimeType: MimeType.MICROSOFT_EXCEL}, attachment);
// 2. 将Excel文件转换为临时Google Sheets文件
var tempSheetFile = Drive.Files.copy(
  {mimeType: MimeType.GOOGLE_SHEETS},
  excelFile.id
);
// 3. 读取临时Sheets文件的数据
var convertedSheet = SpreadsheetApp.openById(tempSheetFile.id).getSheetByName("Report");
var data = convertedSheet.getDataRange().getValues();

// ... 后续粘贴数据的逻辑不变 ...

// 4. 最后删除Excel文件和临时Sheets文件
Drive.Files.remove(excelFile.id);
Drive.Files.remove(tempSheetFile.id);
完整修改后代码
// Get the sheets and ranges to use
var marketsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("markets");
var marketsRange = marketsSheet.getDataRange();
var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Magnite Raw Data");
// Clear the existing data in range A2:L of the "Magnite Raw Data" sheet
dataSheet.getRange("A2:M").clearContent();
// Get the values from the markets range and remove any empty rows
var marketsValues = marketsRange.getValues().filter(row => row[0] !== '');
// Loop through the markets values and process each one
for (var i = 0; i < marketsValues.length; i++) {
  var subject = marketsValues[i][0];
  // Search for emails with the given subject
  var threads = GmailApp.search('from: reports-delivery@magnite.com "subject:' + subject + '" in:PMP Reports'); // "subject contains"
  if (threads.length === 0) {
    console.log('No emails found with subject: ' + subject);
    continue;
  }
  // Download the first attachment of the first message found
  var message = threads[0].getMessages()[0];
  var attachment = message.getAttachments()[0];
  if (!attachment) {
    console.log('No attachments found in email with subject: ' + subject);
    continue;
  }

  // --- 修改后的核心转换逻辑 ---
  // 1. 保存附件为Excel文件
  var excelFile = Drive.Files.insert({mimeType: MimeType.MICROSOFT_EXCEL}, attachment);
  // 2. 转换为临时Google Sheets文件
  var tempSheetFile = Drive.Files.copy(
    {mimeType: MimeType.GOOGLE_SHEETS},
    excelFile.id
  );
  // 3. 读取数据
  var convertedSheet = SpreadsheetApp.openById(tempSheetFile.id).getSheetByName("Report");
  var data = convertedSheet.getDataRange().getValues();
  // --- 核心逻辑结束 ---

  // Find the last row with data in column A of the data sheet
  var lastRow = dataSheet.getRange("A:A").getValues().filter(String).length + 1;
  // Paste the data into the data sheet starting at the last row found
  var dataRange = dataSheet.getRange(lastRow, 1, data.length, data[0].length);
  dataRange.setValues(data);
  // Delete the generated files
  Drive.Files.remove(excelFile.id);
  Drive.Files.remove(tempSheetFile.id);
}
// Delete rows containing "Total" or "Date" in column A of the "Magnite Raw Data" sheet
var dataRange = dataSheet.getRange("A2:M" + dataSheet.getLastRow());
var values = dataRange.getValues();
var newValues = values.filter(function(row) {
  return row[0].indexOf("Total") === -1 && row[0].indexOf("Date") === -1;
});
dataRange.clearContent();
dataRange.offset(0, 0, newValues.length, newValues[0].length).setValues(newValues);
// Add "Magnite" to column M to column N of the "Magnite Raw Data" sheet
var lastRowIndex = dataSheet.getLastRow();
var range = dataSheet.getRange("M2:M" + lastRowIndex);
range.offset(0, 0, range.getNumRows(), 1).setValue("Magnite");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:23:20