gpt4 book ai didi

pdf - Google Sheets Export to PDF Script - 为什么要导出隐藏的行?

转载 作者:行者123 更新时间:2023-12-03 23:35:58 26 4
gpt4 key购买 nike

我有一个脚本,用于将单个 google 表格保存为给定文件夹中的 pdf 文档。

由于工作表的内容是动态的,有时底部会加载一些空网格行,因此我提供了一种在导出文件之前隐藏没有内容的行的方法。

直到最近,这一直按要求工作。现在该函数隐藏了行,但创建的文件将这些行显示为未隐藏。

知道这是否是由于最近对 google sheet api 的更改,我可以做些什么来恢复旧功能吗?

这是我以前工作的代码块:

// API function for saving a single sheet without hiding sheets
// *******************************************************************************


function singleSheetAPIExport(){

// Get active spreadsheet URL
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = 'Example';
var main = ss.getSheetByName(sheetName)
var folderID = '1wsxxxxxxblahblah' // Google Drive Folder ID

Logger.log('maxrows: ' + main.getMaxRows());
Logger.log('last row: ' + main.getLastRow());

// Base URL
var url = "https://docs.google.com/spreadsheets/d/SS_ID/export?".replace("SS_ID", ss.getId());

/* Specify PDF export parameters
From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
*/

var url_ext = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
+ '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&gid='; // the sheet's Id

var token = ScriptApp.getOAuthToken();

// Hide All Empty Rows in the Print Sheet
var maxRows = main.getMaxRows();
var lastRow = main.getLastRow();
if (maxRows-lastRow != 0){
main.hideRows(lastRow+1, maxRows-lastRow);
}

// Get the response for your specific sheet that can later be converted to blob
var response = UrlFetchApp.fetch(url + url_ext + main.getSheetId(), {
headers: {
'Authorization': 'Bearer ' + token
}
});

// Save pdf version
var saveFolder = 'PDF';
var parentFolder = DriveApp.getFolderById(folderID);
var folder, folders = DriveApp.getFoldersByName(saveFolder);
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = parentFolder.createFolder(saveFolder);
}
var name = main.getRange("B8").getValue();
var cleanName = name.replace(/([^a-zA-Z0-9() #%~-])/g, "-");
folder.createFile(response.getBlob().setName(cleanName));

// Unhide the rows again
var fullSheetRange = main.getRange(1,1,main.getMaxRows(), main.getMaxColumns());
main.unhideRow(fullSheetRange);

}

功能在 6 月 17 日至 19 日之间发生了变化,这可能表明 api 发生了变化,但我找不到任何证据表明这种变化。

我之前在 Stack Exchange 的 Web 应用程序站点上发布了此内容,但由于我看到 google 应用程序团队推荐 Stackoverflow 进行查询,因此已将其删除并重新发布。

最佳答案

我在您提供的测试表上测试了您的代码,它按预期工作。但是,如果我创建大量额外的行 - 实际上我可以重现您的隐藏行被导出的错误。

您的代码中的问题是您在隐藏空行后立即创建文件并在创建文件后立即取消隐藏行:

您必须知道 createFile() 是一个异步请求 - 就像所有 Google API 调用一样。这意味着如果文件较大,创建可能需要更长的时间,您的 unhideRow() 方法可能会在创建文件之前执行。

类似地,如果您在隐藏所有行之前执行调用,这将导致您出现同样的问题。解决方案在于使用 SpreadsheetApp.flush(); 函数,该函数可确保仅在前一个函数完成后才执行函数。在 folder.createFile(response.getBlob().setName(cleanName)); 前后插入 SpreadsheetApp.flush(); 可以解决您的问题。

关于pdf - Google Sheets Export to PDF Script - 为什么要导出隐藏的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56853670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com