Как сопоставить один столбец и заменить другой (соответствующий) столбец на другом листе с помощью скрипта приложений Google? - PullRequest
1 голос
/ 18 июня 2019

У меня есть два листа в электронной таблице Google, один с исходными данными и двумя столбцами (имя, категория) и один с переклассифицированными данными (имя, новая категория).

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

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

Я новичок в скриптах приложений, поэтому не знаю, с чего начать.

Например, если «брокколи» относится к категории «овощ», а груша относится к категории «фрукты» на исходном листе, а на 2-м листе «брокколи» относится к категории «горькая», а груша - как «сладкая», Мне бы хотелось, чтобы приложение заменяло слова «овощ» и «фрукты» на «горький» и «сладкий» соответственно на оригинальном листе.

1 Ответ

0 голосов
/ 18 июня 2019

Эта функция добавляет новые категории на первый лист, в моем случае это 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 до:

enter image description here

Лист 2 до:

enter image description here

Sheet1 после запуска функции:

enter image description here


Поправка для отражения макета электронной таблицы и обновления столбца 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); 
}

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