Попытка вернуть все совпадающие значения, а не только первое значение из результатов листов - PullRequest
0 голосов
/ 20 сентября 2019

Я могу успешно вернуть значение из первой или последней позиции из сопоставленного поиска в листах Google с приведенным ниже кодом, используя indexOf () или lastIndexOf ().Есть ли способ, что он может вернуть все позиции и, следовательно, все значения поискового запроса, а не только один?Я понимаю, что indexOf () возвращает только 1 значение.По сути, если элемент присутствует более одного раза, метод indexOf возвращает позицию первого вхождения, а не всех из них.

Приведенный ниже код использует значение поля «модель» в моей форме интерфейса, чтобы найти позицию и вернуть цену из следующего столбца.

function getCost(model){
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Index");
  var data = ws.getRange(1, 1, 
  ws.getRange("B1").getDataRegion().getLastRow(), 
  ws.getRange("C1").getDataRegion().getLastRow()).getValues();

  var modelList = data.map(function(r){ return r[0]; });
  var priceList = data.map(function(r){ return r[1]; });
  var dateList = data.map(function(r){ return r[2]; });

  var position = modelList.lastIndexOf(model);  

  var results = priceList[position];


  if(position > -1){
     return results;
  } else {
     return 'Please contact us for a valuation on this vehicle';
  }

}

Возвращает цену соответствующего транспортного средства из формы, но если существует несколько совпадений одной и той же модели транспортного средства и разных цен, тогда я хочу вернуть все совпадающие значения, а не только одно.

Также в идеале я хочу вернуть все значения и найти среднюю цену возвращаемых значений.Это также возможно?

Заранее спасибо, я новичок в Javascript и Google Apps Script.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Вот решение, которое возвращает как все индексы, так и вычисляет среднюю цену:

function getCost(model){  
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Index");
  var data = ws.getRange(1, 1, ws.getRange("B1").getDataRegion().getLastRow(), ws.getRange("C1").getDataRegion().getLastRow()).getValues();
  var modelList = data.map(function(r){ return r[0]; });
  var priceList = data.map(function(r){ return r[1]; });
  var dateList = data.map(function(r){ return r[2]; });   
  var position=getAllIndexes(modelList, model); 
  var results = [];
  Logger.log(modelList);
  for(var j=0;j<position.length;j++){
    results.push(priceList[position[j]]);
  }
  Logger.log(results);
  if(results){
  var averageCost=average(results);
     return averageCost;
  } else {
     return 'Please contact us for a valuation on this vehicle';
  }
}

function getAllIndexes(modelList, model) {
  var indexes = [];
  for(var i = 0; i < modelList.length; i++){
        if (modelList[i] == model){
            indexes.push(i);
        }
      }
  Logger.log(indexes);
  return indexes;
}

function average(modelCost){
  var sum=0;
  for(var k=0;k<modelCost.length;k++){
    sum+=modelCost[k];
  }
  return (sum/modelCost.length);
} 

Я включил в код некоторые журналы, чтобы вы могли лучше отслеживать, что делает каждая функция.

Пожалуйста, проверьте еще раз, если определение диапазона соответствует намеченному.Синтаксис равен getRange(row, column, numRows, numColumns).

0 голосов
/ 20 сентября 2019

Не уверен, какие типы данных они содержат, но это должно помочь вам:

function getCost(searchedModel) {
  const ss = SpreadsheetApp.openByUrl(url)
  const ws = ss.getSheetByName('Index')
  const data = ws
    .getRange(
      1,
      1,
      ws
        .getRange('B1')
        .getDataRegion()
        .getLastRow(),
      ws
        .getRange('C1')
        .getDataRegion()
        .getLastRow()
    )
    .getValues()

  const results = data.filter(([model, price, date]) => searchedModel === model)

  if (results.length > 0) {
    return results
  } else {
    return 'Please contact us for a valuation on this vehicle'
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...