google-apps-script - 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);
解决方案
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
您应该养成在编写代码时参考文档的习惯,并特别注意方法返回的类型。
推荐阅读
- spring - 运行流spring-cloud-starter-stream组件时没有主要清单属性
- mongodb - CosmosDB $sample 聚合始终提供相同的结果
- sap - 在 Mac for Tableau 上无法识别 SAP HANA 的 JDBC 驱动程序
- php - 在 Laravel 上加载我现有的文件
- vba - 将数据从一行复制到下一张表中的下一个可用行,循环
- servicenow - 有没有办法在 ServiceNow 中快速过滤列表?
- angular - 如何为 WebStorm 中的多个源目录解析 tsconfig.app.json 中的别名
- python - 使用 BeautifulSoup 为网页中的每个单词添加链接
- android - 如何将通过编辑文本获取的android中的整个用户输入与硬编码字符串进行比较
- quartz.net - quartz.net 将 trigger_state 设置为 ERROR,不知道为什么