Дублируйте каждую строку в Google Листе с пустым первым столбцом в дублированном наборе данных

#google-apps-script #google-sheets #duplicates

Вопрос:

У меня есть страница Google со списком нескольких продуктов и артикулами

Данные приведены ниже:

 title  |    sku    |  image  | category |  price   
prod1  |  p1-type  |  1.jpg  | cat1     |  1 USD   
prod2  |  p2-type  |  2.jpg  | cat2     |  2 USD   
prod3  |  p3-type  |  3.jpg  | cat2     |  5 USD   
 

Я хочу, чтобы каждая строка в нем дублировалась, в первом столбце было установлено значение null, а значение артикула добавлялось с помощью a "_2" . Таким образом, данные будут такими, как показано ниже:

 title  |    sku    |  image  | category |  price   
prod1  |  p1-type  |  1.jpg  | cat1     |  1 USD 
       |  p1-type_2|  1.jpg  | cat1     |  1 USD   
prod2  |  p2-type  |  2.jpg  | cat2     |  2 USD   
       |  p2-type_2|  2.jpg  | cat2     |  2 USD   
prod3  |  p3-type  |  3.jpg  | cat2     |  5 USD
       |  p3-type_2|  3.jpg  | cat2     |  5 USD   
 

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

 function autoDup() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = [];
  
  for(var n in data){

    if(n == 0){
      newData.push(data[n]); //Skip first row
    } else {
      
      newData.push(data[n]);     
      //set data in first column to null
      data[n][0] = "";  //This however set the value in prev row to empty aswell.
      newData.push(data[n]);      
    }
  }

 sheet.getRange(1,1,newData.length,newData[0].length).setValues(newerData);
}
 

Ответ №1:

 function funkycopy() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0');
  const vs = sh.getRange(2,1,sh.getLastRow() - 1,sh.getLastColumn()).getValues();
  const oA = [];
  vs.forEach(r => {
    let c = r.slice();
    c[0] = '';
    c[1] = c[1]   '_2';
    oA.push(r);
    oA.push(c);
  });
  sh.getRange(2,1,sh.getLastRow() - 1,sh.getLastColumn()).clearContent();
  sh.getRange(2,1,oA.length,oA[0].length).setValues(oA);
}
 

Обозначение стрелкой

Комментарии:

1. Пришлось внести следующие правки, и тогда это сработало как заклинание :-), 1. const ss = SpreadsheetApp.getActiveSpreadsheet(); amp; 2. const sh = ss.getSheetByName('Sheet1');

2. getActive() и getActiveSpreadsheet () — это одна и та же команда.

3. Я только что перепроверил, вы правы. Я понял, что проблема была только ss.getSheetByName('Sheet0'); в этом . Поскольку мое имя листа было «лист 1», просто исправление этого сработало. Спасибо. @купер

Ответ №2:

Я думаю, что этого будет достаточно.

 function fixRange(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const wSh = ss.getActiveSheet();
  var oldValues = wSh.getRange("A2:E"   wSh.getLastRow()).getValues();
  var newValues = [];
  
  for(var i=0;i<oldValues.length;i  ){
    if(oldValues[i][0]!=''){
    newValues.push(oldValues[i]);
    newValues.push(['',oldValues[i][1]   '_2',oldValues[i][2],oldValues[i][3],oldValues[i][4]]);
    }
  
  }
  wSh.getRange(2,1,newValues.length,5).setValues(newValues);
}
 

Комментарии:

1. Проверьте ссылку на обозначение стрелок в моем ответе. В большинстве методов массива первым является элемент, вторым-индекс, а третьим-исходный массив. Но все они объясняются в любом хорошем справочнике по javascript.

2. @Cooper Ценю это! Спасибо!

3. Вплоть до 7-й строки это работало, а затем некоторые столбцы пропали без вести. Если это поможет, вот этот лист: docs.google.com/spreadsheets/d/…

4. Я построил его так, чтобы он работал для вашего примера с 5 столбцами. Похоже, у вас есть больше данных, чем это.