如何在Google Apps Script中等待IMPORTXML加载完成后再执行后续步骤
解决方案
你遇到的问题是Google Sheets的公式异步计算特性导致的,Google Apps Script默认不会等待IMPORTXML这类外部请求公式加载完成,就会继续执行后续代码,新增轮询等待逻辑即可解决,修改后的完整代码如下:
function GoldPriceNotification() { // 获取表格和对应工作表 var ss = SpreadsheetApp.openById("1oVMpP_MvwX2cUNviJc1NcubBj4ezR0qs2FjHEWfV8ps").getSheetByName("Gold") // 写入获取黄金价格的公式 ss.getRange("C6").setValue("=importxml(D2,E2)"); ss.getRange("C7").setValue("=importxml(D3,E3)"); // 获取历史价格数据 var lastSellPrice = ss.getRange("C2").getDisplayValue(); var lastBuyPrice = ss.getRange("C3").getDisplayValue(); // 获取当前时间 ss.getRange("B5").setValue("=now()") var time = ss.getRange("B5").getDisplayValue(); // 等待配置:最长等待30秒,每1秒检查一次加载状态 const MAX_WAIT_MS = 30000; const CHECK_INTERVAL_MS = 1000; let waitedTime = 0; let newSellPrice, newBuyPrice; // 轮询等待公式加载完成 while (waitedTime < MAX_WAIT_MS) { // 强制刷新表格计算结果 SpreadsheetApp.flush(); newSellPrice = ss.getRange("C6").getDisplayValue(); newBuyPrice = ss.getRange("C7").getDisplayValue(); // 加载完成则跳出循环 if (newSellPrice !== "Loading..." && newBuyPrice !== "Loading..." && newSellPrice !== "#N/A" && newBuyPrice !== "#N/A") { break; } Utilities.sleep(CHECK_INTERVAL_MS); waitedTime += CHECK_INTERVAL_MS; } // 超时则清理数据终止执行 if (waitedTime >= MAX_WAIT_MS) { ss.getRange("C6:C7").clear(); return; } // 价格变动判断逻辑 if (lastSellPrice != newSellPrice || lastBuyPrice != newBuyPrice) { // 更新历史价格 ss.getRange("C6:C7").copyValuesToRange(ss, 3, 3, 2, 3) // 发送Line通知 var message = "\n🏅เอ็งฮงฮวด สวัสดีค่ะ🏅" + "\n😊🙏ขออนุญาตแจ้งราคาทอง🙏😊" + "\n⏳ณ " + time + "⏳" + "\nราคาซื้อ: " + newBuyPrice + "\nราคาขาย: " + newSellPrice + "" sendLineNotify(message) } // 统一清理临时公式区域 ss.getRange("C6:C7").clear() }
修改核心说明:
- 新增了超时保护机制,最长等待30秒,避免网络故障时脚本无限运行占用配额
- 每次检查加载状态前调用
SpreadsheetApp.flush(),强制同步表格的最新计算结果 - 通过
Utilities.sleep()实现间隔检查,减少不必要的接口调用避免触发Google服务限制 - 简化了重复的清理逻辑,最后统一处理临时公式区域的清理
内容的提问来源于stack exchange,提问作者Setthawut Kulsrisuwan
相关产品推荐
相关产品推荐

