Как я могу разделить 2 столбца ячеек с несколькими строками на уникальные строки, сохраняя / дублируя окружающие данные? - PullRequest
2 голосов
/ 14 января 2020

Я работаю с листом, который имеет 2 столбца с ячейками, которые могут иметь несколько строк в ячейке. Я пытаюсь выяснить, как разделить обе ячейки одновременно (так как в каждой из них должно быть одинаковое количество строк) и поддерживать / дублировать окружающие данные для каждого нового разбиения. Я видел несколько разных способов выполнения sh с помощью формулы и сценария, как показано ниже, но все они, похоже, зависят только от разделения одного столбца ячеек, а не двух столбцов.

Мой набор данных ниже, и он извлекает информацию из представления форм, поэтому я не могу изменить способ ввода данных, мне просто нужно попытаться найти лучший способ для анализа данных. В идеале обе ячейки должны иметь одинаковые линии и разделяться при возврате каретки (я наиболее знаком с использованием CHAR (10)), и мне просто нужно выяснить, как разделить обе одновременно. Я собрал несколько примеров данных на листе, связанном ниже. Я также включил один пример кода, который я обнаружил, который выполняет эту задачу для одного столбца ячеек (от здесь , но довольно старый - я также не совсем уверен, как изменить мой диапазон не должен быть столбцом B в примере)

function result(range) {
  var output2 = [];
  for(var i=0, iLen=range.length; i<iLen; i++) {
    var s = range[i][1].split("\n");    
    for(var j=0, jLen=s.length; j<jLen; j++) {
      var output1 = []; 
      for(var k=0, kLen=range[0].length; k<kLen; k++) {
        if(k == 1) {
          output1.push(s[j]);
        } else {
          output1.push(range[i][k]);
        }
      }
      output2.push(output1);
    }    
  }
  return output2;
}    

Образец данных доступен здесь:
https://docs.google.com/spreadsheets/d/1edR-pKxx98l01zFE2LBUkWvQJPKQ9IV_LIHieDwf-1I/edit?usp=sharing

Любая помощь будет принята с благодарностью!

Ответы [ 4 ]

2 голосов
/ 15 января 2020
  • Вы хотите добиться конвертации из RAW DATA в DESIRED RESULT в вашей общей электронной таблице.
  • Вы хотите добиться этого, используя пользовательскую функцию.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Пример сценария:

Когда используется ваша общая таблица, поместите формулу =result(A3:E6) в ячейку.

function result(values) {
  return values.reduce(function(ar, e) {
    var [colD, colE] = e.slice(-2).map(function(f) {
      return f.split("\n").map(function(g) {return g.split(/\s+/)[1] || g});
    });
    return ar.concat(colD.map(function(f, j) {return e.slice(0, 3).concat([f, colE[j]])}));
  }, []);
}
  • Сначала значения столбцов "D" и "E" разделяются.
  • В качестве следующего шага каждая строка создается из разделенных значений.

Результат:

enter image description here

Примечание:

  • Этот образец сценария можно использовать для образца электронной таблицы. Если формат значений изменяется, сценарий может быть недоступен. Пожалуйста, будьте осторожны.

Список литературы:

Если я неправильно понял ваш вопрос, и это был не результат, вы хочу, я прошу прощения.

Добавлено:

Из вашей второй общей таблицы я подготовил скрипт для преобразования из RAW DATA в DESIRED RESULT. Я думал, что столбец «D» отличается от 1-й общей таблицы в вашей 2-й общей таблице. В этом случае "1 email1@sample.com\n2 email2@sample.com\n3 email3@sample.com" требуется преобразовать в Bill, Steve и Ted. Но это не может быть сделано. Поэтому я подготовил следующий пример сценария, используя ваши первые логи c. Это как email1@sample.com, email2@sample.com и email3@sample.com.

Пример сценария:

Чтобы использовать этот сценарий, поместите =result(A3:O6) в ячейку.

function result(values) {
  return values.reduce(function(ar, e) {
    var head = e.splice(0, 3);
    var [colD, colE] = e.splice(0, 2).map(function(f) {return f.split("\n").map(function(g) {return g.split(/\s+/)[1] || g})});
    var values = colD.map(function(f, j) {return head.concat([f, colE[j]]).concat(e)});
    return ar.concat(values);
  }, []);
}
1 голос
/ 17 января 2020

С формулой:

={ arrayformula(
   vlookup(
     transpose(
       split(
         textjoin(
           ",",true,
           filter(regexreplace(row(D3:D) & regexreplace(D3:D,"[^\" & char(10) &
                  "]",""),"[" & char(10) & "]","," & 
                  row(D3:D)),D3:D<>""
           )
         ),",",true,false
       )
     ),{row(A3:A),A3:D},{2,3,4},false)
   ),
   transpose(
     split(
       textjoin(
         "," ,true,
         filter(
           regexreplace( D3:D,"[\" & CHAR(10) & "]","," ),D3:D<>""
         )
       ),",",true,false
     )
   ),
   transpose(
    split(
      textjoin(
        "," ,true,
        filter(
          regexreplace( E3:E,"[\" & CHAR(10) & "]","," )
          ,E3:E<>""
        )
      ),",",true,false
    )
  )
}
1 голос
/ 15 января 2020

Я думаю, что ответил на Reddit?

https://reddit.app.link/uGOAxYRcg3

Matt

1 голос
/ 15 января 2020

Попробуйте это:

function runOne() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet227');
  var osh=ss.getSheetByName('Sheet222');
  osh.clearContents();
  var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var vA=rg.getValues();
  var n=0;
  for(var i=0;i+n<vA.length;i++) {
    var dA=vA[i+n][3].split('\n');
    var eA=vA[i+n][4].split('\n');
    if(dA.length>1) {
      for(var j=0;j<dA.length;j++)  {
        var nr=[vA[i+n][0],vA[i+n][1],vA[i+n][2],dA[j],eA[j]];
        vA.splice(i+n++,0,nr);
      }
      vA.splice(i+n--,1);
    }
  }
  vA.unshift(hA);
  osh.getRange(1,1,vA.length,vA[0].length).setValues(vA);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...