修改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
相关产品推荐
相关产品推荐

