Удалите ненужные разделители из функции конкатенации скрипта 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]];

Другие вопросы по тегам