首页 > 解决方案 > DriveApp.getFileById() 引发服务器错误

问题描述

我有一个脚本,用于将 Google 工作表导出为 PDF。到目前为止,它一直工作没有问题。我将它部署为 Web 应用程序,以便任何人都可以使用它。自从我部署它以来,它一直没有用。我尝试归档 Web 应用程序,但没有帮助。

问题似乎与DriveApp.getFileById()功能有关。我在我的代码中插入了许多console.log()函数,试图缩小它实际失败的地方和原因。执行日志显示错误发生在我导出的同一位置,但这些console.log()函数并没有帮助我找出原因。我收到的错误是:

例外:很抱歉,发生服务器错误。请稍等,然后重试。

我已经尝试研究这个很长一段时间了,并尝试了我发现的建议。我仔细检查了所有变量和代码语法。我也知道它pdfid被正确地拉动,正如通过记录它所验证的那样。自从它一直在工作以来,我根本没有更改这部分代码或它所依赖的任何部分。我相信 Web App 部署是问题所在,但我不确定为什么或如何解决它。它也可能是我缺少的其他东西,因为即使在归档 Web 应用程序之后它仍然无法正常工作。

这是代码,显示的最后一行是它失败的地方:

function exportLog(type) {
  console.log('Starting Export');
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var realExp = sheet.getSheetByName('exportThis');
var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
  //console.log('Spreadsheet created');
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var sheet = realExp.copyTo(newSpreadsheet);
  //console.log('Copied');

SpreadsheetApp.getActiveSpreadsheet().toast('Beginning export...','Loading...',-1);
  //console.log('using new sheet');
newSpreadsheet.getSheetByName('Copy of exportThis').showSheet();
  //console.log('successfully used new sheet');
newSpreadsheet.getSheetByName('Sheet1').activate();
newSpreadsheet.deleteActiveSheet();
  //console.log('deleted');
var pdfid = newSpreadsheet.getId();
  console.log(pdfid); // Correctly logs ID
var pdf = DriveApp.getFileById(pdfid);

标签: google-apps-scriptgoogle-sheets

解决方案


function exportLog(type) {
  const ss1 = SpreadsheetApp.getActive();//this returns the active spreadsheet
  const xsh = ss1.getSheetByName('exportThis');
  const ss2 = SpreadsheetApp.create("Spreadsheet to export");
  const nsh = xsh.copyTo(ss2);
  nsh.showSheet();//you can't really show the sheet because ss2 is not the active spreadsheet
  ss2.getSheetByName('Sheet1').activate();//again you can't activate this sheet because ss2 is not the active spreadsheet
  ss2.deleteActiveSheet();//This is not the active spreadsheet
  const pdfid = ss2.getId();//I don't know why you call this a pdf it's a spreadsheet
  const pdf = DriveApp.getFileById(pdfid); //again ss2 is a newly created spreadsheet
}

//Input parameter is never used

您应该养成在编写代码时参考文档的习惯,并特别注意方法返回的类型。


推荐阅读