Google 表格 - 根据 2 个内容复制和粘贴数据,游戏编号和名称
Google Sheets - Copy & Paste Data based on 2 things, Game # and Name
一直在尝试找出一种根据输入的游戏编号和玩家姓名复制和粘贴数据的方法。将其分解,一场比赛只有 4 名球员,记分是建立在 Sheet 1 上的模板上。Sheet 2 是一个由 16 名不同球员组成的集团,显示比赛编号和比赛开始日期播放了。
这是我遇到问题的地方。在模板中,我基本上是手动输入分数以及游戏编号。我正在尝试制作一个宏,一旦我按下它,它将扫描 Sheet 1 上的游戏编号作为字符串并识别 Sheet 2 中的匹配单元格。然后它将继续复制和粘贴日期。然后,脚本将识别 Sheet 1 中的玩家姓名行,并将相应的分数复制并粘贴到 Sheet 2 中,在之前由游戏编号标识的同一行中。这真的很棘手,因为它必须避免粘贴到 16 个玩家列中的其他 12 个。
此函数收集 sheet 个分数,并根据游戏编号将它们分配到正确的行,并根据与玩家相关的 header 个字符串分配到正确的列。
请注意,您无法从脚本编辑器中运行此功能,因为它需要 onEdit 事件 object。将其复制到脚本编辑器,确保 sheet 名称正确,然后将复选框添加到 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:
动画:
一直在尝试找出一种根据输入的游戏编号和玩家姓名复制和粘贴数据的方法。将其分解,一场比赛只有 4 名球员,记分是建立在 Sheet 1 上的模板上。Sheet 2 是一个由 16 名不同球员组成的集团,显示比赛编号和比赛开始日期播放了。
这是我遇到问题的地方。在模板中,我基本上是手动输入分数以及游戏编号。我正在尝试制作一个宏,一旦我按下它,它将扫描 Sheet 1 上的游戏编号作为字符串并识别 Sheet 2 中的匹配单元格。然后它将继续复制和粘贴日期。然后,脚本将识别 Sheet 1 中的玩家姓名行,并将相应的分数复制并粘贴到 Sheet 2 中,在之前由游戏编号标识的同一行中。这真的很棘手,因为它必须避免粘贴到 16 个玩家列中的其他 12 个。
此函数收集 sheet 个分数,并根据游戏编号将它们分配到正确的行,并根据与玩家相关的 header 个字符串分配到正确的列。
请注意,您无法从脚本编辑器中运行此功能,因为它需要 onEdit 事件 object。将其复制到脚本编辑器,确保 sheet 名称正确,然后将复选框添加到 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:
动画: