【问题标题】:How to set absolute reference in G-Sheets using Google Script如何使用 Google Script 在 G-Sheets 中设置绝对引用
【发布时间】:2020-10-21 20:18:32
【问题描述】:

我正在尝试在大约 600 行中使用 VLOOKUP 公式(由用户请求)填充多列,但脚本花费的时间太长(4-5 分钟)。我想通过在第一行插入公式来加快速度,用绝对引用锁定 VLOOKUP 范围,然后将公式复制到该范围内。但是,我找不到设置绝对引用的 GAS 方法(例如 A1:A100 变为 $A$1:$A$100)

我浏览了 Google 的开发者中心,发现了一些返回布尔值的方法,例如 isEndColumnBounded()。不过,我找不到任何可以让我设置绝对参考的东西。

现在,我将带有增量搜索 ID 和静态范围的 vlookup 公式填充到二维数组中,然后将范围值设置为数组值。这是两列所必需的,每列大约需要 2 分钟...对于仅填充大约 600 行来说太长了。

function myFunction()
  var idCol = 
    compSht.createTextFinder("ID")
    .matchEntireCell(true).findNext().getColumn();
    var vIndex = getVIndex(arcSht);
    var aEquation = [];  

  for(i=0;i<compSht.getLastRow()-1;i++) {
    aEquation[i] = new Array;    

    aEquation[i][0] =
      "=IFERROR(VLOOKUP(" + compSht.getRange(i+2, idCol).getA1Notation() 
      + ",'" + arcStr + " Submission'!" + vIndex[2] + "," + vIndex[0] + 
      ',false), "No Data")';
  }
  compSht.getRange(2, hcCol, lRow-1).setValues(aEquation);
}

function getVIndex(sheet) {
  var idCol = 
    sheet.createTextFinder("ID").matchEntireCell(true);
    .findNext().getColumn();
  var hcCol = sheet.createTextFinder("Total HC").findNext().getColumn();
  var tcCol = sheet.createTextFinder("Total Cost").findNext().getColumn();

  var range = 
    sheet.getRange(2,idCol,sheet.getLastRow()-1,tcCol-idCol+1)
    .getA1Notation();

  var index = [];
  index[0] = hcCol - idCol + 1;
  index[1] = tcCol - idCol + 1;
  index[2] = range;

  return index;
}

我猜这个问题有两个解决方案:要么我找到一个设置绝对引用的方法,要么有人告诉我为什么我的代码这么慢。我对这些东西很陌生,还有很大的改进空间。让我知道你有什么建议。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我相信你的速度问题就在这里

    for(i=0;i<compSht.getLastRow()-1;i++) {
        aEquation[i] = new Array;    
    
        aEquation[i][0] =
          "=IFERROR(VLOOKUP(" + compSht.getRange(i+2, idCol).getA1Notation() 
          + ",'" + arcStr + " Submission'!" + vIndex[2] + "," + vIndex[0] + 
          ',false), "No Data")';
      }
      compSht.getRange(2, hcCol, lRow-1).setValues(aEquation);
    }
    

    更具体地说 compSht.getRange(i+2, idCol).getA1Notation()

    基本上发生的事情是,每次循环迭代时,您都会从工作表中获取一个范围,这会大大减慢速度。更好的解决方案是获取整个工作表的范围(或者您正在使用的范围很大),并使用var values = compSht.getRange(desiredRange).getValues() 获取所有单元格值(包括空单元格)的二维数组。

    然后您可以根据需要修改值数组,然后将其复制回范围 compSht.getRange(desiredRange).setValues(values);

    请记住更改您在 values 数组中查看的位置,以说明从 0 而不是 1 开始的数组索引。

    就在这种情况下获得 A1 表示法而言,这有点草率,但您可以创建一个数组来引用类似

    好的,现在一切正常

    var alpharray = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    var doubleAlpha = [];
    var fullArray = [];
    var k = 0;
    for(var i = 0; i < 26; i++){
      for(var j = 0; j < 26; j++){
        doubleAlpha[k] =  `${alpharray[i]}` + `${alpharray[j]}`;
        fullArray[i] = alpharray[i];
        k++;
      }
    }
    for(var k = 26; k < 26 + doubleAlpha.length; k++){
      fullArray[k] = doubleAlpha[k-26];
    }
    

    这将为您提供一个所有列最多为 ZZ 的数组,然后您可以将行号附加到列的字母上,您将获得 A1 符号。因此,对于您的情况,如果您正在查看第 i+2 行和第 idCol 列,您可以通过这样做来获得 A1 符号

    var string = "";
    string += fullArray[idCol-1] + (i+2);
    

    所以如果idCol 是49,i 是5,那么string 将输出AW7。

    希望对你有帮助

    编辑:如果您还想通过那些 for 循环节省时间,如果您只想复制它,我会生成一个包含组合的数组:

    var columnArray = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX","IY","IZ","JA","JB","JC","JD","JE","JF","JG","JH","JI","JJ","JK","JL","JM","JN","JO","JP","JQ","JR","JS","JT","JU","JV","JW","JX","JY","JZ","KA","KB","KC","KD","KE","KF","KG","KH","KI","KJ","KK","KL","KM","KN","KO","KP","KQ","KR","KS","KT","KU","KV","KW","KX","KY","KZ","LA","LB","LC","LD","LE","LF","LG","LH","LI","LJ","LK","LL","LM","LN","LO","LP","LQ","LR","LS","LT","LU","LV","LW","LX","LY","LZ","MA","MB","MC","MD","ME","MF","MG","MH","MI","MJ","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NB","NC","ND","NE","NF","NG","NH","NI","NJ","NK","NL","NM","NN","NO","NP","NQ","NR","NS","NT","NU","NV","NW","NX","NY","NZ","OA","OB","OC","OD","OE","OF","OG","OH","OI","OJ","OK","OL","OM","ON","OO","OP","OQ","OR","OS","OT","OU","OV","OW","OX","OY","OZ","PA","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL","PM","PN","PO","PP","PQ","PR","PS","PT","PU","PV","PW","PX","PY","PZ","QA","QB","QC","QD","QE","QF","QG","QH","QI","QJ","QK","QL","QM","QN","QO","QP","QQ","QR","QS","QT","QU","QV","QW","QX","QY","QZ","RA","RB","RC","RD","RE","RF","RG","RH","RI","RJ","RK","RL","RM","RN","RO","RP","RQ","RR","RS","RT","RU","RV","RW","RX","RY","RZ","SA","SB","SC","SD","SE","SF","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SP","SQ","SR","SS","ST","SU","SV","SW","SX","SY","SZ","TA","TB","TC","TD","TE","TF","TG","TH","TI","TJ","TK","TL","TM","TN","TO","TP","TQ","TR","TS","TT","TU","TV","TW","TX","TY","TZ","UA","UB","UC","UD","UE","UF","UG","UH","UI","UJ","UK","UL","UM","UN","UO","UP","UQ","UR","US","UT","UU","UV","UW","UX","UY","UZ","VA","VB","VC","VD","VE","VF","VG","VH","VI","VJ","VK","VL","VM","VN","VO","VP","VQ","VR","VS","VT","VU","VV","VW","VX","VY","VZ","WA","WB","WC","WD","WE","WF","WG","WH","WI","WJ","WK","WL","WM","WN","WO","WP","WQ","WR","WS","WT","WU","WV","WW","WX","WY","WZ","XA","XB","XC","XD","XE","XF","XG","XH","XI","XJ","XK","XL","XM","XN","XO","XP","XQ","XR","XS","XT","XU","XV","XW","XX","XY","XZ","YA","YB","YC","YD","YE","YF","YG","YH","YI","YJ","YK","YL","YM","YN","YO","YP","YQ","YR","YS","YT","YU","YV","YW","YX","YY","YZ","ZA","ZB","ZC","ZD","ZE","ZF","ZG","ZH","ZI","ZJ","ZK","ZL","ZM","ZN","ZO","ZP","ZQ","ZR","ZS","ZT","ZU","ZV","ZW","ZX","ZY","ZZ"]
    

    【讨论】:

    • 哇!这很棒!谢谢!
    【解决方案2】:

    这是创建绝对 A1Notation 引用的通用解决方案

    扩展@Passer-By 的答案(归功于他)。这是一个获取行和列索引并将其转换为绝对引用的函数。注意:数组开头的空字符串不是拼写错误,它是用来将每个字母的索引值偏移一个。

    const getAbsoluteA1Notation = (row, column) => {
    var columnLetters = ["", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT","AU","AV","AW","AX","AY","AZ","BA","BB","BC","BD","BE","BF","BG","BH","BI","BJ","BK","BL","BM","BN","BO","BP","BQ","BR","BS","BT","BU","BV","BW","BX","BY","BZ","CA","CB","CC","CD","CE","CF","CG","CH","CI","CJ","CK","CL","CM","CN","CO","CP","CQ","CR","CS","CT","CU","CV","CW","CX","CY","CZ","DA","DB","DC","DD","DE","DF","DG","DH","DI","DJ","DK","DL","DM","DN","DO","DP","DQ","DR","DS","DT","DU","DV","DW","DX","DY","DZ","EA","EB","EC","ED","EE","EF","EG","EH","EI","EJ","EK","EL","EM","EN","EO","EP","EQ","ER","ES","ET","EU","EV","EW","EX","EY","EZ","FA","FB","FC","FD","FE","FF","FG","FH","FI","FJ","FK","FL","FM","FN","FO","FP","FQ","FR","FS","FT","FU","FV","FW","FX","FY","FZ","GA","GB","GC","GD","GE","GF","GG","GH","GI","GJ","GK","GL","GM","GN","GO","GP","GQ","GR","GS","GT","GU","GV","GW","GX","GY","GZ","HA","HB","HC","HD","HE","HF","HG","HH","HI","HJ","HK","HL","HM","HN","HO","HP","HQ","HR","HS","HT","HU","HV","HW","HX","HY","HZ","IA","IB","IC","ID","IE","IF","IG","IH","II","IJ","IK","IL","IM","IN","IO","IP","IQ","IR","IS","IT","IU","IV","IW","IX","IY","IZ","JA","JB","JC","JD","JE","JF","JG","JH","JI","JJ","JK","JL","JM","JN","JO","JP","JQ","JR","JS","JT","JU","JV","JW","JX","JY","JZ","KA","KB","KC","KD","KE","KF","KG","KH","KI","KJ","KK","KL","KM","KN","KO","KP","KQ","KR","KS","KT","KU","KV","KW","KX","KY","KZ","LA","LB","LC","LD","LE","LF","LG","LH","LI","LJ","LK","LL","LM","LN","LO","LP","LQ","LR","LS","LT","LU","LV","LW","LX","LY","LZ","MA","MB","MC","MD","ME","MF","MG","MH","MI","MJ","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NB","NC","ND","NE","NF","NG","NH","NI","NJ","NK","NL","NM","NN","NO","NP","NQ","NR","NS","NT","NU","NV","NW","NX","NY","NZ","OA","OB","OC","OD","OE","OF","OG","OH","OI","OJ","OK","OL","OM","ON","OO","OP","OQ","OR","OS","OT","OU","OV","OW","OX","OY","OZ","PA","PB","PC","PD","PE","PF","PG","PH","PI","PJ","PK","PL","PM","PN","PO","PP","PQ","PR","PS","PT","PU","PV","PW","PX","PY","PZ","QA","QB","QC","QD","QE","QF","QG","QH","QI","QJ","QK","QL","QM","QN","QO","QP","QQ","QR","QS","QT","QU","QV","QW","QX","QY","QZ","RA","RB","RC","RD","RE","RF","RG","RH","RI","RJ","RK","RL","RM","RN","RO","RP","RQ","RR","RS","RT","RU","RV","RW","RX","RY","RZ","SA","SB","SC","SD","SE","SF","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SP","SQ","SR","SS","ST","SU","SV","SW","SX","SY","SZ","TA","TB","TC","TD","TE","TF","TG","TH","TI","TJ","TK","TL","TM","TN","TO","TP","TQ","TR","TS","TT","TU","TV","TW","TX","TY","TZ","UA","UB","UC","UD","UE","UF","UG","UH","UI","UJ","UK","UL","UM","UN","UO","UP","UQ","UR","US","UT","UU","UV","UW","UX","UY","UZ","VA","VB","VC","VD","VE","VF","VG","VH","VI","VJ","VK","VL","VM","VN","VO","VP","VQ","VR","VS","VT","VU","VV","VW","VX","VY","VZ","WA","WB","WC","WD","WE","WF","WG","WH","WI","WJ","WK","WL","WM","WN","WO","WP","WQ","WR","WS","WT","WU","WV","WW","WX","WY","WZ","XA","XB","XC","XD","XE","XF","XG","XH","XI","XJ","XK","XL","XM","XN","XO","XP","XQ","XR","XS","XT","XU","XV","XW","XX","XY","XZ","YA","YB","YC","YD","YE","YF","YG","YH","YI","YJ","YK","YL","YM","YN","YO","YP","YQ","YR","YS","YT","YU","YV","YW","YX","YY","YZ","ZA","ZB","ZC","ZD","ZE","ZF","ZG","ZH","ZI","ZJ","ZK","ZL","ZM","ZN","ZO","ZP","ZQ","ZR","ZS","ZT","ZU","ZV","ZW","ZX","ZY","ZZ"];
      return `$${columnLetters[column]}$${row}`;
    };
    

    关键词: 获取A1表示法 绝对单元格参考谷歌表 固定单元格参考谷歌表 锁定单元格参考谷歌表 美元符号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多