Эта функция добавляет новые категории на первый лист, в моем случае это Sheet1. Я мог бы так же легко заменить первую на вторую категорию на листе 1, но таким образом легче определить, перехватила ли функция правильные данные.
function findCats() {
var ss=SpreadsheetApp.getActive();
var sh1=ss.getSheetByName('Sheet1');
var rg1=sh1.getRange(2,1,sh1.getLastRow()-1,sh1.getLastColumn()+1);
var vA1=rg1.getValues();
var sh2=ss.getSheetByName('Sheet2');
var rg2=sh2.getRange(2,1,sh2.getLastRow()-1,sh2.getLastColumn());
var vA2=rg2.getValues();
var obj2={nA:[]};
for(var i=0;i<vA2.length;i++) {
obj2[vA2[i][0]]=vA2[i][1];
obj2.nA.push(vA2[i][0]);
}
for(var i=0;i<vA1.length;i++) {
var idx=obj2.nA.indexOf(vA1[i][0]);
if(idx>-1) {
vA1[i][2]=obj2[vA1[i][0]];
}
}
rg1.setValues(vA1);
}
Лист 1 до:
Лист 2 до:
Sheet1 после запуска функции:
Поправка для отражения макета электронной таблицы и обновления столбца Category2
function so5664033702() {
var ss=SpreadsheetApp.getActive();
var tarsheet=ss.getSheetByName('Old Categories');
var tarLC =tarsheet.getLastColumn();
var tarLR = tarsheet.getLastRow();
var tarRange=tarsheet.getRange(2,1,tarLR-1,tarLC);
//Logger.log("DEBUG: Target range ="+tarRange.getA1Notation());
var tarValues=tarRange.getValues();
// get the Cat2 values so that the range can be easily updated after the loop
var tarcat2Range = tarsheet.getRange(2,6,tarLR-1);
//Logger.log("DEBUG: Target Cat2 range ="+tarcat2Range.getA1Notation());
var tarcat2Values = tarcat2Range.getValues();
var srcsheet=ss.getSheetByName('New Categories');
var srcLR = srcsheet.getLastRow();
var srcRange=srcsheet.getRange(2,1,srcLR-1,3);
//Logger.log("DEBUG: Source Range ="+srcRange.getA1Notation());
var srcValues=srcRange.getValues();
// create array to build names
var tarNames = [];
// loop through Old Category Names to pupulate the array
for (z=0;z<tarValues.length;z++){
tarNames.push(tarValues[z][1]);
}
// loop through the new category Names to find the match on Old Categories
// the value "c" will be the row number.
for (i=0;i<srcValues.length;i++){
var c = tarNames.indexOf(srcValues[i][0]);
//Logger.log("DEBUG: c = "+c+", value: "+srcValues[i][0]+", cat2:"+tarcat2Values[c][0] +", new Cat2:"+srcValues[i][2]);
// if c = -1, then there is no match; otherwise update the OldCategory/category2 value with the value from New category
if (c!=-1){
tarcat2Values[c][0] = srcValues[i][2];
}
} // end of the New category Loop
// setValues for the Cat2 range with the updated values.
tarcat2Range.setValues(tarcat2Values);
}