Удалите ненужные разделители из функции конкатенации скрипта Google
Я пытаюсь объединить два столбца, разделенных ,
и опубликовать результаты в третий столбец
Я получаю:
colA colb concatenated
aa bb ww ww aa bb, ww ww
mm m,
qq ,qq
zz oo zz oo,
,
ss vv zz ss, vv zz
как удалить ненужные разделители и пробелы, чтобы я получил:
colA colb concatenated
aa bb ww ww aa bb, ww ww
mm mm
qq qq
zz oo zz oo
ss vv zz ss, vv zz
Если это полезно, вот лист Google с некоторыми данными https://docs.google.com/spreadsheets/d/12Hn9bVy5GmRTVxMcrZ_bdkVSlfrem-Jr4cyev_gg6BE/edit?usp=sharing
Спасибо
function ConCat() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
var lc = sheet.getLastColumn();
var lr = sheet.getLastRow();
var values = sheet.getRange(2, 1, lr,lc).getValues();
var result = []; //Create a empty array to be filled concatenated elements
//Add items to results
for(var i=0; i<lr; i++){
result[i] = [values[i][0]+", "+values[i][1]];
}
//Post back to column 3 starting on row 2
sheet.getRange(2, 3, lr, 1).setValues(result);
}
3 ответа
Попробуй это:
function ConCat() {
var sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Elements");
var lc = sheet.getLastColumn();
var lr = sheet.getLastRow();
var values = sheet.getRange(2, 1, lr,lc).getValues();
var result = []; //Create a empty array to be filled concatenated elements
//Add items to results
for(var i=0; i<lr; i++){
if(values[i][0]!='' && values[i][1]!=''){
result[i] = [values[i][0]+", "+values[i][1]];
}
else if(values[i][0]!='' && values[i][1]==''){
result[i] = [values[i][0]]
}
else if(values[i][0]=='' && values[i][1]==''){
result[i] = [values[i][1]]
}
else{
result[i]=['']
}
}
//Post back to column 3 starting on row 2
sheet.getRange(2, 3, lr, 1).setValues(result);
}
Я пропускаю материал электронной таблицы Google, потому что я не думаю, что это действительно имеет отношение к ответу на ваш вопрос.
Это выглядит как values
содержит ваши предметы для присоединения. Я переименовал его в vals
(поскольку values
это уже связанная функция), и только что проверил это в консоли JavaScript Firefox. Если vals содержит пустые строки (как это):
vals = [ ['aa bb', 'ww ww'], ['mm', ''], ['', 'qq'], ['zz oo', ''],
['', ''], ['ss', 'vv zz'] ];
Тогда я могу воспроизвести вашу проблему, используя join
(который проще читать, чем реализованная вручную версия):
>> for (var i=0; i<vals.length; i++)
console.log(vals[i].join(','))
aa bb,ww ww
mm,
,qq
zz oo,
,
ss,vv zz
Итак, на самом деле вы просто хотите отфильтровать список пустых строк перед присоединением:
>> filterEmpties = function(acc, el) {
if(el != "")
acc.push(el);
return acc;
}
>> for (var i=0; i<vals.length; i++){
console.log(
vals[i].reduce(filterEmpties, []).join(', '))
}
aa bb, ww ww
mm
qq
zz oo
ss, vv zz
И я думаю, что это в основном то, что вы пытались достичь, верно? Я использовал Array.prototype.reduce, чтобы удалить пустые элементы перед использованием join
,
Ура!
РЕДАКТИРОВАТЬ:
Кажется, что мое использование консоли вызвало некоторую путаницу в реализации моего ответа. Я интегрирую свое решение с вашим кодом, чтобы вы поняли, что я имел в виду (я исправил ваш отступ;)):
var filterEmpties = function(acc, el) {
if(el != "")
acc.push(el);
return acc;
}
function ConCat() {
var sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("Elements");
var lc = sheet.getLastColumn();
var lr = sheet.getLastRow();
var values = sheet.getRange(2, 1, lr,lc).getValues();
var result = []; // Create a empty array to be filled concatenated elements
// Add items to results
for(var i=0; i<values.length; i++){
result[i] = values.reduce(filterEmpties, []).join(', ');
}
// Post back to column 3 starting on row 2
sheet.getRange(2, 3, lr, 1).setValues(result);
}
И это все, что вам нужно сделать, если я правильно понял ваш вклад. Надеюсь это поможет.
result[i] = [!values[i][0]?
!values[i][1]?"":values[i][1]
:!values[i][1]? values[i][0]:
values[i][0] + ", " + values[i][1]];
Вместо: result[i] = [values [i][0]+", "+values [i][1]];