如何借助Google Sheet实现客户仅查看自身培训记录?
Google Sheet实现学员仅查看个人培训记录的方法
完全可以实现这个需求,下面是两种实用的方案:
方案一:查询函数+受保护范围(简单易上手)
- 第一步:把所有培训记录放到一个隐藏工作表(比如命名为「总数据库」),只给自己开放这个表的编辑/查看权限,学员看不到这个表。
- 第二步:新建一个对外的工作表(比如叫「个人记录查询」):
- 在A1单元格写提示:
请输入你的姓名:,B1单元格留空让学员输入自己的名字 - 在A3单元格粘贴公式:
=IF(B1="","",QUERY('总数据库'!A:C,"SELECT * WHERE A = '"&B1&"'",1)) - 给这个表设置「受保护的范围」,锁定公式区域,防止学员修改公式,同时给所有学员开放这个表的「查看」权限。
学员只要输入自己的姓名,就能自动筛选出属于自己的培训记录。
- 在A1单元格写提示:
方案二:Google Apps Script自动匹配(无需手动输入)
如果想让学员打开表格直接看到自己的记录,不用手动输入姓名,可以用脚本实现:
- 打开你的Google Sheet,点击顶部「扩展程序」→「Apps Script」
- 删除默认代码,粘贴下面的脚本:
function onOpen() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const userEmail = Session.getActiveUser().getEmail(); // 提前建一个「用户映射」工作表,A列存姓名,B列存对应学员的Google登录邮箱 const userMapSheet = ss.getSheetByName('用户映射'); const userMapData = userMapSheet.getDataRange().getValues(); let targetName = ''; // 匹配当前登录用户的邮箱对应的姓名 for (let i = 1; i < userMapData.length; i++) { if (userMapData[i][1] === userEmail) { targetName = userMapData[i][0]; break; } } const dataSheet = ss.getSheetByName('总数据库'); const allData = dataSheet.getDataRange().getValues(); // 创建或重置「我的记录」工作表 let personalSheet = ss.getSheetByName('我的记录'); if (personalSheet) { personalSheet.clearContents(); } else { personalSheet = ss.insertSheet('我的记录'); } // 筛选并写入当前用户的记录 const filteredRecords = allData.filter(row => row[0] === targetName); if (filteredRecords.length > 0) { personalSheet.getRange(1, 1, filteredRecords.length, filteredRecords[0].length).setValues(filteredRecords); } else { personalSheet.getRange(1,1).setValue('未找到你的培训记录'); } // 隐藏其他工作表,只显示个人记录 ss.getSheets().forEach(sheet => { if (sheet.getName() !== '我的记录') { sheet.hideSheet(); } }); }
- 保存脚本(命名随便,比如「PersonalRecordFilter」),首次运行需要授权(按照提示完成权限验证即可)
- 给学员分配表格的「查看」权限,他们打开表格时,脚本会自动根据登录邮箱匹配姓名,筛选出对应的记录,并且只显示「我的记录」工作表,看不到其他学员的数据。
注意事项
- 方案一里要确保学员输入的姓名和「总数据库」里的完全一致(包括大小写、空格),否则查不到数据
- 方案二必须提前建好「用户映射」表,把姓名和对应登录邮箱一一对应,避免重名导致的错误
- 无论用哪种方案,「总数据库」工作表一定要设置成仅你能访问,防止学员看到全部数据
内容的提问来源于stack exchange,提问作者Moe Wong
相关产品推荐
相关产品推荐

