#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 столбцами. Похоже, у вас есть больше данных, чем это.