You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌表格Apps Script引入外部JS报错:SyntaxError: expected expression, got '<'

问题分析与解决方案

核心问题

报错的根本原因是未使用Apps Script模板引擎解析HTML中的模板语法:你通过HtmlService.createHtmlOutputFromFile('FilterUI')加载侧边栏HTML时,文件内的<?= ?>模板标记不会被解析,直接作为文本输出到浏览器,导致JS执行时遇到<符号触发语法错误。此外,用JSON.stringify+eval加载JS代码属于冗余且有安全风险的操作,完全可以用更直接的方式实现。

修复步骤

1. 修改侧边栏加载逻辑

将showSidebar函数中的createHtmlOutputFromFile替换为createTemplateFromFile并调用evaluate(),让模板引擎处理HTML中的模板语法:

function showSidebar() {
  const htmlTemplate = HtmlService.createTemplateFromFile('FilterUI');
  const html = htmlTemplate.evaluate()
    .setTitle('Filter by Distance')
    .setWidth(400);
  SpreadsheetApp.getUi().showSidebar(html);
}

2. 优化外部JS引入方式

直接在FilterUI.html的<script>标签中用不转义的模板语法引入FilterUICode.html的内容,无需JSON.stringify和eval:

<script>
  <?!= include("FilterUICode") ?>
</script>

使用<?!=而非<?=的原因是:不需要对JS代码进行HTML转义(转义会破坏JS语法),!=表示直接输出原始内容。

3. 保留现有include函数

你的include函数逻辑正确,无需修改:

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

失败原因说明

  • createHtmlOutputFromFile仅加载原始HTML内容,不会解析模板标记,导致<?= JSON.stringify(include("FilterUICode")) ?>直接作为无效JS代码输出,触发语法错误。
  • 即便模板被解析,JSON.stringify转义JS代码再用eval执行属于冗余操作,直接插入原始JS代码更高效安全。

验证方式

修改后执行clasp push --force推送代码,刷新表格并打开侧边栏,debug面板会正常输出日志,控制台也会打印预设的加载信息,所有逻辑将正常运行。


内容的提问来源于stack exchange,提问作者Chris Bedford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:46:00