Вы хотите установить, можно ли найти ключевые слова в одном списке (Список № 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);
}