在Google Apps Script Web应用中使用导入字体遇CORS异常问题
解决Google Apps Script Web应用中自定义字体的CORS异常问题
嗨,我来帮你搞定这个CORS的麻烦!你之前用Google Docs导入图片没问题,但字体触发CORS,核心原因是浏览器对字体资源的跨域访问有严格的CORS限制,而Google Drive直接返回的文件链接并没有配置允许你Web应用域名的CORS响应头,所以被拦截了。
给你几个可行的解决方案,按推荐程度排序:
方案1:用Google Apps Script代理字体文件(最稳妥)
这是绕开CORS最可靠的方式,通过Apps Script作为中间层返回字体文件,这样响应头可以由我们控制:
- 在你的Apps Script项目里新增一个函数:
function doGet(e) { // 替换成你的字体文件ID const fontFileId = "1r2a5nd6om75url39428dfju4"; try { const file = DriveApp.getFileById(fontFileId); const blob = file.getBlob(); // 返回字体内容并设置正确的MIME类型 return ContentService.createTextOutput(blob.getDataAsString()) .setMimeType(blob.getContentType()); } catch (err) { return ContentService.createTextOutput("无法加载字体:" + err.message) .setMimeType(ContentService.MimeType.TEXT); } }
部署这个脚本为Web应用:
- 点击右上角的「部署」→「新部署」
- 类型选择「Web应用」
- 执行权限选「我自己」(如果你的Web应用是公开的,访问权限选「任何人,甚至匿名」)
- 点击「部署」,复制生成的Web应用URL
把CSS里的字体URL替换成这个部署后的URL:
@font-face { font-family: MyCustomFont; src: url("你的Apps Script Web应用URL"); } #headBanner { font-family: MyCustomFont; }
方案2:检查Drive文件的共享设置(辅助步骤)
即使使用代理,也确保你的字体文件在Drive里的共享设置是「任何人有查看权限」,不然Apps Script可能无法读取文件。不过这一步单独做还是解决不了CORS,必须配合代理。
为什么图片没问题但字体不行?
浏览器对不同资源的CORS策略不一样:图片属于「被动资源」,除非你把它用于Canvas等需要读写的场景,否则浏览器不会严格校验CORS;但字体属于「可执行资源」(会影响页面渲染逻辑),浏览器会强制检查跨域请求的CORS头,所以直接用Drive URL会触发异常。
内容的提问来源于stack exchange,提问作者Daccache




