首页 > 解决方案 > 谷歌表格 - 根据 2 件事复制和粘贴数据,游戏编号和名称

问题描述

一直在尝试根据输入的游戏编号和玩家姓名找出一种复制和粘贴数据的方法。细分而言,一场比赛只有 4 名玩家,计分建立在表格 1 上的模板上。表格 2 是 16 名不同玩家的集合,显示比赛编号和比赛开始的日期。

这是我遇到麻烦的地方。在模板中,我基本上是手动输入分数以及游戏编号。我正在尝试制作一个宏,一旦按下它,它就会将表格 1 上的游戏编号扫描为字符串,并识别表格 2 中的匹配单元格。然后它将继续复制并粘贴日期。然后,该脚本将识别表 1 中的玩家姓名行,并将相应的分数复制并粘贴到表 2 上,即之前由游戏编号标识的同一行中。这真的很棘手,因为它必须避免粘贴到 16 名玩家列中的其他 12 名中。

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-macros

解决方案


此函数收集第一张纸上的分数,并根据游戏编号将它们分配到正确的行,并根据与玩家相关的标题字符串将它们分配到正确的列。

请注意,您不能从脚本编辑器运行此函数,因为它需要 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:

在此处输入图像描述

动画:

在此处输入图像描述


推荐阅读