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

Google Apps Script中await调用google.script.run无法写入全局变量问题

问题成因
  • async 函数的返回值本质是Promise对象,你在$(document).ready的回调中直接调用loadPatientData()时没有加await关键字,JS引擎不会阻塞等待该异步函数执行完毕,会直接往下执行后续的google.script.run.logThis(patientData.names)逻辑。
  • 此时服务端接口getPatientData()的请求还在异步传输过程中,全局变量patientData.names还没被赋值,所以打印出来是null。你在loadPatientData内部能正常打印到值,是因为那行日志在await拿到接口返回值之后才执行,和外部的log调用是并行时序,不存在先后执行的保证。
  • 你把google.script.run包装成Promise的写法是正确的,问题核心出在调用async函数时没有等待其执行完成。
修复方案

首先将$(document).ready的回调函数声明为async,调用loadPatientData()时加上await,确保数据赋值完成后再执行后续日志逻辑,修正后的完整代码如下:

let patientData = {};

// 将ready回调改为async函数,支持内部使用await关键字
$(document).ready(async function() {
  // 加await等待loadPatientData完全执行完成、全局变量赋值完毕
  await loadPatientData();
  // 此时patientData.names已经完成赋值,不会再返回null
  google.script.run.logThis(patientData.names);
})

async function loadPatientData() {
  const a = await new Promise(r => {
    google.script.run.withSuccessHandler(r).getPatientData();
  });
  patientData.names = a;
}

可选优化

如果不想依赖全局变量传值,可以直接让loadPatientData返回拿到的患者数据,调用时直接接收返回值使用,减少全局变量污染,写法参考:

$(document).ready(async function() {
  const patientData = await loadPatientData();
  google.script.run.logThis(patientData.names);
})

async function loadPatientData() {
  const names = await new Promise(r => {
    google.script.run.withSuccessHandler(r).getPatientData();
  });
  // 直接返回组装好的数据,不需要操作全局变量
  return { names };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:39:15