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

如何结合JS与Google Apps Script使用sessionStorage避免重复请求?

问题:sessionStorage缓存存在时是否需要重写下拉选项构建逻辑?

我希望当sessionStorage中存在对应orderPo的数据时,避免调用服务器端函数getSuppliersForPoFromSS(orderPo, origin),但不确定当前代码结构是否正确。以下是我编写的代码:

**/
 * 从电子表格获取指定供应商并构建带选项的下拉输入框。
 * @param {Object} selecObject
 * @param {String} origin 指定数据获取来源
 */
function loadSuppliersForPoFromSS(selectObject, origin) {
  orderPo = selectObject.value;
  document.getElementById('selectSupplier').innerHTML = '';
   
  // 尝试获取二维数组,例如:[["Item1", "Item2"]]
  let ar = JSON.parse(sessionStorage.getItem(orderPo));
 
   
  if(!ar){   
  google.script.run.withSuccessHandler(function(ar) {
    let select = document.getElementById('selectSupplier');
    let options = select.getElementsByTagName('option');
    for (let i = options.length; i--;) {
      select.removeChild(options[i]);
    }
    let option = document.createElement("option");
    option.value = "";
    option.text = "";
    select.appendChild(option);
    ar.forEach(function(item, index) {
      let option = document.createElement("option");
      option.value = item.toLowerCase();
      option.text = item;
      select.appendChild(option)
    });
  }).getSuppliersForPoFromSS(orderPo, origin);
 } else {
  // 是否需要重写从sessionStorage构建选项的代码?
}

请问是否需要在else分支中重新编写从sessionStorage获取数据构建下拉选项的逻辑?


需要在else分支中编写构建下拉选项的逻辑,否则当sessionStorage存在缓存数据时,下拉框会保持为空状态(你开头已经清空了selectSupplier的innerHTML,但没有后续填充逻辑)。

为了避免代码冗余,建议把构建下拉选项的逻辑抽成独立函数,这样不管是从服务器获取数据还是从sessionStorage读取缓存,都可以复用同一套逻辑,同时还能在获取到服务器数据后把它存入sessionStorage,方便后续复用。

优化后的代码示例:

/**
 * 从电子表格获取指定供应商并构建带选项的下拉输入框。
 * @param {Object} selectObject
 * @param {String} origin 指定数据获取来源
 */
function loadSuppliersForPoFromSS(selectObject, origin) {
  const orderPo = selectObject.value;
  const select = document.getElementById('selectSupplier');
  // 先清空下拉框
  select.innerHTML = '';

  // 尝试从sessionStorage获取缓存数据
  let ar = JSON.parse(sessionStorage.getItem(orderPo));

  if (!ar) {
    // 缓存不存在时调用服务器接口
    google.script.run.withSuccessHandler(function(serverData) {
      // 将服务器返回的数据存入sessionStorage做缓存
      sessionStorage.setItem(orderPo, JSON.stringify(serverData));
      // 复用构建下拉框的逻辑
      buildSupplierSelect(select, serverData);
    }).getSuppliersForPoFromSS(orderPo, origin);
  } else {
    // 缓存存在时直接用缓存数据构建下拉框
    buildSupplierSelect(select, ar);
  }
}

/**
 * 复用的下拉框构建函数
 * @param {HTMLElement} selectElement 目标下拉框元素
 * @param {Array} data 供应商数据数组
 */
function buildSupplierSelect(selectElement, data) {
  // 添加空选项
  const emptyOption = document.createElement("option");
  emptyOption.value = "";
  emptyOption.text = "";
  selectElement.appendChild(emptyOption);

  // 遍历数据添加选项
  data.forEach(item => {
    const option = document.createElement("option");
    option.value = item.toLowerCase();
    option.text = item;
    selectElement.appendChild(option);
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:24:28