在Google脚本中查询数组

时间:2018-12-05 21:00:41

标签: google-apps-script

我已经学习了如何在Google表格中使用查询公式。我想知道Google App脚本中是否有类似的功能。我想看一个2D数组,找到一个变量相交的值。

考虑一个数组,其中每一行都有一个名称,而每一列都有一个月。十字路口有一些美元数额。我需要编程语言才能说:row(Nate),column(11月)的值是什么?

https://docs.google.com/spreadsheets/d/1vd7hgRVNTtIvKrr2ssLzVoDw5IVaXjOjF39CvVm2cYQ/

我知道如何使用for循环。我想知道是否有更简单的方法。我希望有array.FindValueAtCoordinates(rowkey,colkey)。

1 个答案:

答案 0 :(得分:0)

尝试一下:

这将在第一列的名称和行号之间以及列标题和列号之间创建一个关联数组。

function testIntersection(){
  var r='Ken';
  var c='Dec18';
  Logger.log(intersection(r,c));
}

function intersection(r,c){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet18');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var colObj={};
  var rowObj={};
  for(var i=0;i<vA.length;i++){
    if(i==0){
      for(var j=0;j<vA[0].length;j++){
        if(vA[i][j] && !colObj.hasOwnProperty(vA[i][j])){
          colObj[vA[i][j]]=j+1;
        }
      }
    }
    if(vA[i][0] && !rowObj.hasOwnProperty(vA[i][0])){
      rowObj[vA[i][0]]=i+1;
    }
  }  
  return sh.getRange(rowObj[r],colObj[c]).getValue();           
}

确保列标题的第一行设置为纯文本格式。否则,它们可能会在auto中解释为日期,并且没有函数getRange(string,class)。

这只是我用来测试以上功能的一些代码。使用类似于您的表。它会生成一个无模式对话框,其中列出了所有可能的交叉点。

function playingWithIntersection(){
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet18');
  var rg1=sh.getRange(1,2,1,sh.getLastColumn()-1);
  var rg2=sh.getRange(2,1,sh.getLastRow()-1,1);
  var ckeys=rg1.getValues();
  var rkeys=rg2.getValues();
  var colkeys=[];
  var rowkeys=[];
  for(var i=0;i<ckeys[0].length;i++){
    colkeys.push(ckeys[0][i]);
  }
  for(var i=0;i<rkeys.length;i++){
    rowkeys.push(rkeys[i][0]);
  }
  var hl='<style>th,td{border:1px solid #000;}</style><table><th>rowkeys</th><th>colkeys</th><th>Value</th><tr></tr>';
  for(var i=0;i<rowkeys.length;i++){
    for(var j=0;j<colkeys.length;j++){
      hl+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td></tr>', rowkeys[i], colkeys[j], intersection(rowkeys[i],colkeys[j]));
    }
  }
  hl+='</table>';
  var ui=HtmlService.createHtmlOutput(hl);
  SpreadsheetApp.getUi().showModelessDialog(ui, 'Intersections')
}