使用Google Apps Script在Google Sheets中查看云端硬盘PDF报错求助
解决Google Apps Script模态框中Drive PDF无法加载的问题
问题原因
出现「drive.google.com refused to connect.」错误的核心原因有两个:
- 跨域框架限制:Google Drive默认禁止直接将文件查看链接嵌入第三方iframe(包括Google Sheets的模态框),浏览器会因
X-Frame-Options头限制阻止加载。 - 链接格式错误:原代码生成的viewer链接嵌套了Drive文件链接,导致请求逻辑混乱,无法正常解析。
修正方案
通过以下调整解决问题:
- 使用Google Drive官方支持的预览嵌入链接替代原有的viewer格式
- 直接通过文件ID生成链接,避免正则匹配的潜在错误
- 确保iframe配置符合Google的嵌入规范
修正后的完整代码
function viewPDF() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var certificateSheet = ss.getSheetByName("Certificate"); // 定义文件名 var filename = certificateSheet.getRange("D4").getValue() + "_" + certificateSheet.getRange("B6").getValue() + "_" + certificateSheet.getRange("D6").getValue() + ".pdf"; // 在「我的云端硬盘」中搜索PDF文件 var folder = DriveApp.getRootFolder(); var files = folder.getFilesByName(filename); // 如果找到文件,加载第一个匹配项 if (files.hasNext()) { var pdfFile = files.next(); var fileId = pdfFile.getId(); // 使用Google Drive官方预览嵌入链接 var embedUrl = "https://drive.google.com/file/d/" + fileId + "/preview"; // 创建模态框HTML内容,添加必要的属性避免加载限制 var html = '<iframe src="' + embedUrl + '" width="100%" height="100%" frameborder="0" allow="autoplay; fullscreen"></iframe>'; // 创建模态对话框 var htmlOutput = HtmlService.createHtmlOutput(html) .setWidth(800) .setHeight(600) .setSandboxMode(HtmlService.SandboxMode.IFRAME); // 明确设置沙箱模式为IFRAME SpreadsheetApp.getUi().showModalDialog(htmlOutput, "PDF Viewer"); } else { // 文件不存在时提示错误 SpreadsheetApp.getUi().alert("PDF文件未找到。"); } }
关键修改点说明
- 简化文件ID获取:直接调用
pdfFile.getId()获取文件ID,比正则匹配更可靠且不易出错。 - 替换为官方嵌入链接:使用
/preview后缀的链接,这是Google Drive专门用于iframe嵌入的格式,不会触发跨域限制。 - 优化iframe属性:添加
frameborder="0"和allow属性,确保预览功能正常启用。 - 明确沙箱模式:显式设置
SandboxMode.IFRAME,确保HtmlService以支持iframe嵌入的模式运行(当前版本默认已是该模式,但显式声明更稳妥)。
额外注意事项
- 确保PDF文件的权限设置为仅自己可见或已共享给当前用户,否则会因权限不足无法加载。
- 如果仍出现加载问题,可尝试清除浏览器缓存或换用无痕模式测试,排除缓存导致的异常。
内容的提问来源于stack exchange,提问作者Angelei
相关产品推荐
相关产品推荐

