google-apps-script - 谷歌表格 - 根据 2 件事复制和粘贴数据,游戏编号和名称
问题描述
一直在尝试根据输入的游戏编号和玩家姓名找出一种复制和粘贴数据的方法。细分而言,一场比赛只有 4 名玩家,计分建立在表格 1 上的模板上。表格 2 是 16 名不同玩家的集合,显示比赛编号和比赛开始的日期。
这是我遇到麻烦的地方。在模板中,我基本上是手动输入分数以及游戏编号。我正在尝试制作一个宏,一旦按下它,它就会将表格 1 上的游戏编号扫描为字符串,并识别表格 2 中的匹配单元格。然后它将继续复制并粘贴日期。然后,该脚本将识别表 1 中的玩家姓名行,并将相应的分数复制并粘贴到表 2 上,即之前由游戏编号标识的同一行中。这真的很棘手,因为它必须避免粘贴到 16 名玩家列中的其他 12 名中。
解决方案
此函数收集第一张纸上的分数,并根据游戏编号将它们分配到正确的行,并根据与玩家相关的标题字符串将它们分配到正确的列。
请注意,您不能从脚本编辑器运行此函数,因为它需要 onEdit 事件对象。将其复制到脚本编辑器,确保工作表名称正确,并将复选框添加到 Sheet1 I1,如果您希望可以使用数据验证下拉菜单来选择游戏编号……这取决于您。
function onEdit(e) {
e.source.toast('Entry')
var sh=e.range.getSheet();
if(sh.getName()=='Sheet1' && e.range.columnStart==9 && e.range.rowStart==1 ) {
e.source.toast('Flag1');
e.range.setValue('FALSE');//reset switch
var hdrToVal={}; //hdr to value from sheet1
var valueA=sh.getRange(5,2,1,4).getValues()[0];
var hdrA=sh.getRange(1,2,1,4).getValues()[0];
hdrA.forEach(function(hdr,i){hdrToVal[hdr]=valueA[i];});
var sh2=e.source.getSheetByName('Sheet2');
var game=sh.getRange(1,8).getValue();//game number used to get row on sheet2
var hA=sh2.getRange(1,3,1,sh2.getLastColumn()).getValues()[0];
var hdrToCol={};//header to columns
var hdrToIdx={};//header to vA index
hA.forEach(function(hdr,i){hdrToCol[hdr]=i+3;hdrToIdx[hdr]=i;});
var vA=sh2.getRange(3,1,sh2.getLastRow()-2,sh2.getLastColumn()).getValues();
for(var i=0;i<vA.length;i++) {
if(vA[i][0]==game) {
var row=i+3;//got the row now
break;
}
}
for(var i=0;i<hA.length;i++) {
if(hdrToVal.hasOwnProperty(hA[i])) {
sh2.getRange(row,hdrToCol[hA[i]]).setValue(hdrToVal[hA[i]]);//everything comes together here.
}
}
}
}
表 1:
表2:
动画:
推荐阅读
- wordpress - AWS EC2 上的 wordpress(2 个实例和一个负载均衡器)
- python - 正则表达式 findall 返回子字符串的元组,而不仅仅是字符串
- python - 从嵌套列表构建链
- reactjs - 如何从 apollo 缓存中获取更新的数据
- php - 有没有像 apache(php) 服务器配置 "open_basedir" 到 tomcat 的方法?
- c++ - 在类的构造函数中初始化由向量组成的矩阵
- jenkins - Jenkins 控制台输出充斥着 [DEBUG] http-outgoing 日志条目
- javascript - 编写一个函数,为 WebGL 绘制的正弦波绘制 x/y?
- javascript - 使用“canvas.toblob()!”后文件名更改!
- r - 在 R 中读取 profvis 的输出