Google Sheets Search и Sum в двух списках - PullRequest
1 голос
/ 31 октября 2019

У меня вопрос к Google Sheets, и я надеялся, что кто-нибудь может помочь.

У меня есть список из примерно 200 ключевых слов, который выглядит следующим образом:

**List 1** 
Italy City trip
Italy Roundtrip
Italy Holiday
Hungary City trip
Czechia City trip
Croatia Montenegro Roundtrip
....
....

И затем у меня есть еще один список с перемешанными ключевыми словами, насчитывающими около 1 миллиона строк. Ключевые слова в этом списке не совсем совпадают с первым списком. Что мне нужно сделать, это найти ключевые слова в списке 1 (выше) в списке 2 (ниже) и суммировать все соответствующие значения стоимости. Как вы можете видеть в списке ниже, ключевые слова из списка 1 находятся во втором списке, но с другими ключевыми словами вокруг них. Например, мне нужна формула, которая будет искать «Поездка по Италии» из списка 1 в списке 2 и суммировать стоимость при появлении этого ключевого слова. В этом случае было бы 6 всего. Сумма стоимости "Поездка по Италии в апреле" и "Поездка по Италии в июне" вместе.

**List 2**                   Cost
Italy City trip April         1
Italy City trip June          5 
Next week Italy Roundtrip     4
Italy Holiday next week       1
Hungary City holiday trip     9
....
....

Надеюсь, это имеет смысл.

Любая помощь будет принята с благодарностью

Ответы [ 3 ]

2 голосов
/ 31 октября 2019

попробовать:

=ARRAYFORMULA(QUERY({IFNA(REGEXEXTRACT(PROPER(C1:C), 
 TEXTJOIN("|", 1, SORT(PROPER(A1:A), 1, 0)))), D1:D}, 
 "select Col1,sum(Col2) 
  where Col1 is not null 
  group by Col1 
  label sum(Col2)''", 0))

0

1 голос
/ 31 октября 2019

Вы хотите установить, можно ли найти ключевые слова в одном списке (Список № 1) в другом списке (Список № 2).

Список № 2 имеет длину 1 000 000 строк, поэтому я бы рекомендовал сегментировать списоктак что время выполнения не превышено. Это то, что вы сможете установить методом проб и ошибок.

Решение заключается в использовании метода javascript indexOf.

Перефразирование из w3schools : indexOf ()возвращает позицию первого вхождения указанного значения в строке. Если значение не найдено, возвращается -1. Таким образом, тестирование if (idx !=-1){ вернет только те значения списка № 1, которые были найдены в списке № 2. Примечание. Метод indexOf () чувствителен к регистру.


 function so5864274503() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var srcname = "source";
  var tgtname = "target";
  var sourceSheet = ss.getSheetByName(srcname);
  var targetSheet = ss.getSheetByName(tgtname);

  // get the source list 
  var sourceLR = sourceSheet.getLastRow();
  var srcData = sourceSheet.getRange(1,1,sourceLR).getValues();

  //get the target list
  var targetLR = targetSheet.getLastRow();
  var tgtlist = targetSheet.getRange(1,1,targetLR,2).getValues();
  var totalcostvalues = [];

  //  start looping through the keywords (list 1)
  for (var s = 0;s<srcData.length;s++){
    var totalcost = 0;
    var value = srcData[s][0]

    // start looping through the strings (List 2)
    for (var i=0;i<tgtlist.length;i++){
      // set cost to zero
      var cumcost = 0;
      // use indexOf to test if keyword is in the string
      var idx = tgtlist[i][0].indexOf(value);

      // value of -1 = no match, value >-1 indicates posuton in the string where the key word was found      
      if (idx !=-1){
        var cost = tgtlist[i][1]
        cumcost = cumcost + cost;
        totalcost = totalcost+cost
      }

    }//end of loop - list2


    //Logger.log("DEBUG: Summary: "+value+", totalcost = "+totalcost)
    totalcostvalues.push([totalcost])

  }// end of loop - list1

  //Logger.log(totalcostvalues);  //DEBUG
  sourceSheet.getRange(1,2,sourceLR).setValues(totalcostvalues);
}
1 голос
/ 31 октября 2019

Я тоже получил, но он чувствителен к регистру немного

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var sheet1 = ss.getSheets()[0];
  var sheet2 = ss.getSheets()[1];

  var valuesSheet1 = sheet1.getRange(2,1, (sheet1.getLastRow()-1), sheet1.getLastColumn()).getValues();
  var valuesCol1Sheet1 = valuesSheet1.map(function(r){return r[0]});
  var valuesCol2Sheet1 = valuesSheet1.map(function(r){return r[1]});
  Logger.log(valuesCol2Sheet1);

  var valuesSheet2 = sheet2.getRange(2,1, (sheet2.getLastRow()-1)).getValues();
  var valuesCol1Sheet2 = valuesSheet2.map(function(r){return r[0]});

  for (var i = 0; i<= valuesCol1Sheet2.length-1; i++){
 var price = 0;
 valuesCol1Sheet1.forEach(function(elt,index){
  var position = elt.toLowerCase().indexOf(valuesCol1Sheet2[i].toLowerCase());
     if(position >-1){
  price = price + valuesCol2Sheet1[index];
  }
  });
  sheet2.getRange((i+2),2).setValue(price);
  };
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...