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

如何获取Google Sheets中ID对应相邻单元格物品名称实现删除确认

解决容器绑定脚本中删除确认提示获取物品名称的问题

问题说明

我有一个容器绑定脚本和HtmlService侧边栏,表格B列存储ID、C列存储物品名称。在HTML输入框输入ID提交后,系统会删除匹配该ID的行。现在希望用confirm()实现删除确认提示,内容为**"您确定要从库存中删除[物品名称]吗"**,但目前无法获取输入ID对应的物品名称。

原表格示例

Column BColumn C
IDitemName
----
MUCH00000001Item1
MUCH00000002Item2
MUCH00000003Item3
......

原GS脚本

var adjacentName = ??????

function showDeleteElectronics() {
  const ui = SpreadsheetApp.getUi();
  var deleteElectronicsForm = HtmlService.createTemplateFromFile('DeleteElectronicsHTML')
  deleteElectronicsForm.itemName = adjacentName;
  var html = deleteElectronicsForm.evaluate();
  html.setTitle("Elektronik Entfernen")
  ui.showSidebar(html);
}


function deleteElectronics(formObject) {
  var electronicsID = formObject.electronicsLocalID 
  var SS = SpreadsheetApp.openById("1GSzlzj7nHPIUt-RIJfsPFobtnLbuoXedtJk1x11BdT0");
  var SHEET = SS.getSheetByName("ElektronikBestand");
  var RANGE = SHEET.getDataRange();
  var DELETE_VAL = electronicsID;
  var LOCAL_ID = 1;

  function deleteItem(){
    
    var rangeVals = RANGE.getValues();
    
    //Reverse the 'for' loop.
    for(var i = rangeVals.length-1; i >= 0; i--){
      if(rangeVals[i][LOCAL_ID] === DELETE_VAL){
        
        SHEET.deleteRow(i+1); 
      };
    };
  };

  deleteItem();
}

原HTML代码

<div class="sidebarwrapper">
  
    <div class="xbuttonwrapper">
        <button class="xbutton" onclick="google.script.host.close()">
            <svg class="x" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212.982 212.982" style="enable-background:new 0 0 212.982 212.982" xml:space="preserve"><path style="fill-rule:evenodd;clip-rule:evenodd" d="m131.804 106.491 75.936-75.936c6.99-6.99 6.99-18.323 0-25.312-6.99-6.99-18.322-6.99-25.312 0L106.491 81.18 30.554 5.242c-6.99-6.99-18.322-6.99-25.312 0-6.989 6.99-6.989 18.323 0 25.312l75.937 75.936-75.937 75.937c-6.989 6.99-6.989 18.323 0 25.312 6.99 6.99 18.322 6.99 25.312 0l75.937-75.937 75.937 75.937c6.989 6.99 18.322 6.99 25.312 0 6.99-6.99 6.99-18.322 0-25.312l-75.936-75.936z"/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></svg>
        </button>
    </div>
  
    <div class="titlewrapper">
        <img class="ctlogotitle" src="https://i.imgur.com/d1VMjvs.png">
        <h1 class="title">Elektronik <br> Entfernen</h1>
    </div>
  
    <div class="divider"></div>
  
    <form class="inputformwrapper" id="removeElectronicsFrom">
      
        <div class="inputblockwrapper">
            <div class="labelwrapper">
                <label class="requiredlabel" for="electronicsLocalID">Lokale ID</label>
            </div>

            <input class="inputfield" 
                type="text"
                placeholder="PREF00000001..."
                minlength="12"
                maxlength="12"                
                id="electronicsLocalID"
                name="electronicsLocalID"                    
                required>
        </div>

        <div class="confirmbuttonwrapper">
            <input class="confirmbutton" 
                type="submit" 
                value="Entfernen"                
                id="removeElectronics">
        </div>

    </form>

</div>

<script>
      document.querySelector("#removeElectronicsFrom").addEventListener("submit", function (e) {
          let confirmString = "Are you sure that you want to delete " + itemName + "?";
          e.preventDefault();
          if (confirm(confirmString)) {
            google.script.run.deleteElectronics(this);
            $('#removeElectronicsFrom').trigger("reset");
          } else {
            $('#removeElectronicsFrom').trigger("reset");
          }
      });
</script>

解决方案

核心逻辑:用户提交ID后,先调用服务器端脚本查询该ID对应的物品名称,拿到名称后弹出确认框,确认通过再执行删除操作。

修改后的GS脚本

function showDeleteElectronics() {
  const ui = SpreadsheetApp.getUi();
  var html = HtmlService.createTemplateFromFile('DeleteElectronicsHTML').evaluate();
  html.setTitle("Elektronik Entfernen");
  ui.showSidebar(html);
}

// 根据ID获取物品名称的新函数
function getItemNameById(id) {
  const SS = SpreadsheetApp.openById("1GSzlzj7nHPIUt-RIJfsPFobtnLbuoXedtJk1x11BdT0");
  const SHEET = SS.getSheetByName("ElektronikBestand");
  const data = SHEET.getDataRange().getValues();
  
  // 遍历查找匹配的ID,返回对应C列的物品名称
  for (let i = 2; i < data.length; i++) { // 从第3行开始,跳过表头和分隔行
    if (data[i][1] === id) { // B列对应索引1
      return data[i][2]; // C列对应索引2
    }
  }
  return "未知物品"; // 未找到ID时的默认值
}

function deleteElectronics(formObject) {
  const electronicsID = formObject.electronicsLocalID;
  const SS = SpreadsheetApp.openById("1GSzlzj7nHPIUt-RIJfsPFobtnLbuoXedtJk1x11BdT0");
  const SHEET = SS.getSheetByName("ElektronikBestand");
  const data = SHEET.getDataRange().getValues();
  
  // 倒序遍历删除,避免行号偏移问题
  for (let i = data.length - 1; i >= 2; i--) {
    if (data[i][1] === electronicsID) {
      SHEET.deleteRow(i + 1); // 表格行号比数组索引大1
    }
  }
}

修改后的HTML代码

<div class="sidebarwrapper">
  
    <div class="xbuttonwrapper">
        <button class="xbutton" onclick="google.script.host.close()">
            <svg class="x" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212.982 212.982" style="enable-background:new 0 0 212.982 212.982" xml:space="preserve"><path style="fill-rule:evenodd;clip-rule:evenodd" d="m131.804 106.491 75.936-75.936c6.99-6.99 6.99-18.323 0-25.312-6.99-6.99-18.322-6.99-25.312 0L106.491 81.18 30.554 5.242c-6.99-6.99-18.322-6.99-25.312 0-6.989 6.99-6.989 18.323 0 25.312l75.937 75.936-75.937 75.937c-6.989 6.99-6.989 18.323 0 25.312 6.99 6.99 18.322 6.99 25.312 0l75.937-75.937 75.937 75.937c6.989 6.99 18.322 6.99 25.312 0 6.99-6.99 6.99-18.322 0-25.312l-75.936-75.936z"/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></svg>
        </button>
    </div>
  
    <div class="titlewrapper">
        <img class="ctlogotitle" src="https://i.imgur.com/d1VMjvs.png">
        <h1 class="title">Elektronik <br> Entfernen</h1>
    </div>
  
    <div class="divider"></div>
  
    <form class="inputformwrapper" id="removeElectronicsFrom">
      
        <div class="inputblockwrapper">
            <div class="labelwrapper">
                <label class="requiredlabel" for="electronicsLocalID">Lokale ID</label>
            </div>

            <input class="inputfield" 
                type="text"
                placeholder="PREF00000001..."
                minlength="12"
                maxlength="12"                
                id="electronicsLocalID"
                name="electronicsLocalID"                    
                required>
        </div>

        <div class="confirmbuttonwrapper">
            <input class="confirmbutton" 
                type="submit" 
                value="Entfernen"                
                id="removeElectronics">
        </div>

    </form>

</div>

<script>
document.querySelector("#removeElectronicsFrom").addEventListener("submit", function (e) {
    e.preventDefault();
    const form = this;
    const electronicsID = form.electronicsLocalID.value;

    // 调用服务器端函数获取物品名称
    google.script.run.withSuccessHandler(function(itemName) {
        const confirmString = `您确定要从库存中删除${itemName}吗?`;
        if (confirm(confirmString)) {
            google.script.run.deleteElectronics(form);
            form.reset();
        } else {
            form.reset();
        }
    }).getItemNameById(electronicsID);
});
</script>

关键修改说明

  1. 新增getItemNameById函数:负责根据输入的ID查询表格中对应的物品名称,客户端通过google.script.run调用该函数获取数据。
  2. 修改HTML提交事件逻辑:先阻止表单默认提交,获取输入的ID后调用服务器端查询函数,拿到名称后再弹出确认框,确认后执行删除。
  3. 优化GS删除逻辑:简化嵌套函数结构,明确遍历起始行(跳过表头和分隔行),保持倒序删除避免行号偏移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:15:32