关联Google表单的表格统计姓名出现次数的自定义菜单脚本实现
实现方案
你可以通过以下步骤同时实现动态读取统计值、批量处理姓名、存储统计结果的需求:
1. 核心逻辑说明
- 先把需要统计的姓名统一存到数组里,后续新增姓名只需要修改数组即可,无需重复写代码
- 遍历姓名数组,逐个调用你已经写好的
getData函数获取实时统计值,拼接后传入弹窗显示 - 统计结果可以存在对象变量(单次运行可用)、脚本属性(永久存储,关闭表格后仍然保留)、指定表格区域(可视化展示,方便直接查看)三种方式,按需选择即可
2. 完整可运行代码
// 你原有统计函数不需要改,直接复用即可 function getData(target) { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1"); var lrow = ss.getLastRow(); var r = ss.getRange(2, 2, lrow-1, 1); // 跳过表头取第二列所有数据 var data = r.getValues(); var count = 0; for (var i=0; i<data.length; i++) { if (data[i][0] == target) { count++; } } return count; } function summarizeNames() { var ui = SpreadsheetApp.getUi(); // 1. 配置要统计的姓名列表,新增姓名直接加在数组里即可 const nameList = ["Jack", "Rose", "Bill"]; // 2. 用于存储统计结果的对象,格式为{姓名: 出现次数} const nameCountMap = {}; // 遍历姓名列表逐个统计+弹窗确认 for(let name of nameList) { // 调用统计函数拿到实时数值 const count = getData(name); // 存到结果对象里 nameCountMap[name] = count; // 拼接内容弹出确认框 const res = ui.prompt(`Is this amount of ${name}s correct?`, count , ui.ButtonSet.YES_NO); // 如果需要处理用户的YES/NO选择,可以在这里加逻辑,比如点YES才存储,点NO可以允许修改之类的 // if(res.getSelectedButton() == ui.Button.YES) { 你的自定义逻辑 } } // ========== 以下是三种存储统计结果的方式,按需开启即可 ========== // 方式1:打印到脚本日志,运行后在Apps Script编辑器的“执行日志”里查看 console.log("统计结果:", nameCountMap); // 方式2:存储到脚本属性,永久保存,后续其他函数也可以读取 // const scriptProps = PropertiesService.getScriptProperties(); // scriptProps.setProperty("nameCountResult", JSON.stringify(nameCountMap)); // 读取的时候用 JSON.parse(scriptProps.getProperty("nameCountResult")) 即可 // 方式3:写入到表格指定区域(比如新建一个叫“统计结果”的工作表,把结果写进去) // const resultSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("统计结果") || SpreadsheetApp.getActiveSpreadsheet().insertSheet("统计结果"); // // 清空原有内容再写 // resultSheet.clearContents(); // resultSheet.getRange(1,1).setValue("姓名"); // resultSheet.getRange(1,2).setValue("出现次数"); // let row = 2; // for(let name in nameCountMap) { // resultSheet.getRange(row,1).setValue(name); // resultSheet.getRange(row,2).setValue(nameCountMap[name]); // row++; // } }
3. 注意事项
- 如果你要统计的姓名有变更,只需要修改
nameList数组里的内容即可,不需要调整其他逻辑 - 如果需要处理用户点击YES/NO后的后续操作,直接在弹窗获取
res的位置加对应逻辑即可 - 三种存储方式都已经写了注释,需要用哪种就把对应代码的注释去掉即可
内容的提问来源于stack exchange,提问作者Kristopher Pacifico
相关产品推荐
相关产品推荐

