Запросить массив в Google Script - PullRequest
0 голосов
/ 06 декабря 2018

Я узнал, как использовать формулу запроса в Google Sheets.Мне интересно, есть ли аналогичная функция в Google App Script.Я хотел бы взглянуть на 2D-массив и найти значение, где переменные пересекаются.

Рассмотрим массив, в котором у каждой строки есть имя, а у каждого столбца - месяц.Пересечение имеет некоторую сумму в долларах.Мне нужен язык программирования, чтобы сказать: каково значение для строки (Nate), столбца (ноябрь)?

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

Я знаю, как это сделать для циклов.Мне интересно, есть ли более простой способ.Я хотел бы, чтобы был массив. FindValueAtCoordinates (rowkey, colkey).

1 Ответ

0 голосов
/ 06 декабря 2018

Попробуйте это:

Это создает ассоциативный массив между именами в первом столбце и номерами строк и между заголовками столбцов и номерами столбцов.

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();           
}

Убедитесь, что верхний ряд заголовков столбцов отформатирован в виде простого текста.В противном случае они могут интерпретироваться как даты в автоматическом режиме, и нет функции 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')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...