2016-01-17 2 views
0

Linked Google Лист: https://docs.google.com/spreadsheets/d/1j2P2V0SCiE7QtK7kdCorpLfYQPFRghKMw4tuCYbqce0/edit?usp=sharingGoogle Sheet - разбить содержимое ячеек в строках и столбцах

У меня есть форма, которая выводит все продукты и количества в одну ячейку:

«Продукт: NF900XC, Количество: 3 продукта : NF900, Количество: 2 продукта: N1930CB, Количество: 2 продукта: N2120, Количество: 1 продукта: NLPCR200, Количество: 2 продукта: N272, Количество: 2"

мне нужен каждый продукт и количество на их собственной линии с соответствующим сбором соответствующих данных.

Я хотел бы содержание (колонка O) разделения в соответствующие колонки:

**Product** : **Quantity** NF900 : 2 N1930CB : 2 N2120 : 1 NLPCR200: 2 N272 : 2

Я использовал SPLIT(text, delimiter, [split_around_each_character]) команды для Имени Фамилии, но я не уверен, как разобрать остальную часть текста в их ряды и столбцы в этой ситуации.

Я буду также функционально копирование строки с меткой времени в

колонка А

Представление Дата

, которые соответствуют Продукция: Количество в ячейке O

Я надеюсь, что это имеет смысл.

ответ

2

Вот код, который я тестировал, и он работает. Код удаляет все слова «Продукт:» и заменяет их запятой. Затем код делает что-то подобное со строкой «Количество:», заменяя ее пустой строкой. Затем он создает массив и преобразует массив в двухмерный массив, так что строки и столбцы могут быть записаны в одном действии.

function convertData() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sh = ss.getSheetByName('Form Submission'); 

    var data = sh.getRange("O2").getValue(); 
    //Logger.log(data); 
    var firstProductRemoved = data.replace("Product: ", ""); 
    //Logger.log(firstProductRemoved); 

    var allProductReplacedWithComma = firstProductRemoved.replace(/Product: /g,","); 
    //Logger.log(allProductReplacedWithComma); 

    var allQuantityReplacedWithNothing = allProductReplacedWithComma.replace(/Quantity: /g,""); 
    //Logger.log(allQuantityReplacedWithNothing); 

    var dataAsArray = allQuantityReplacedWithNothing.split(","); 

    var outerArray = [], innerArray = []; 
    var i=0; 

    for (i=0;i<dataAsArray.length;i+=2) { 
    innerArray = []; //reset every loop 

    innerArray.push(dataAsArray[i]); 
    innerArray.push(dataAsArray[i+1]); 
    outerArray.push(innerArray); 
    }; 
    //Logger.log(outerArray); 

    var orderItemsSh = ss.getSheetByName('Order Items'); 
    orderItemsSh.getRange(orderItemsSh.getLastRow()+1, 15,outerArray.length, 2).setValues(outerArray); 
}; 
+1

Вау, спасибо! Как я могу вам компенсировать? – Mars

+0

Благодарим за отзыв и отметим ответ как правильный. Если вы хотите, вы также можете повысить. –

0

Вы могли бы быть заинтересованы в более общем решении, а не тот, который должен опираться на знание специфики Выражаясь во входных строках.

Эта функция kvStringToArray() вернет массив, который может быть записан непосредственно в таблицу с использованием Range.setvalues(). Это чистый JavaScript, поэтому его также можно использовать за пределами среды сценариев Google Apps.

RegExp используется для последовательного определения пар ключ: значение во входных данных, и функция предполагает, что есть «строки» информации, которые могут быть идентифицированы повторами уже обнаруженных «ключей».

var formInput = "Product: NF900XC, Quantity: 3 Product: NF900, Quantity: 2 Product: N1930CB, Quantity: 2 Product: N2120, Quantity: 1 Product: NLPCR200, Quantity: 2 Product: N272, Quantity: 2"; 
 
snippet.log(
 
    JSON.stringify(
 
    kvStringToArray(formInput))); 
 

 
/** 
 
* Convert a given string of key:value pairs into a two-dimensional 
 
* array, with keys as headers, and "items" as rows. 
 
* From: http://stackoverflow.com/a/34847199/1677912 
 
* 
 
* @param {string} str A string containing key:value pairs. 
 
* 
 
* @returns {string[][]} A two-dimensional array of strings. 
 
*/ 
 
function kvStringToArray(str) { 
 
    var re = /\s*(\w*?)\s*:\s*([^,\s]*)/g, // See https://regex101.com/r/kM7gY1/1 
 
     arr,   // array to capture key:value pairs 
 
     data = [],  // array to return table 
 
     row = [],  // array for building table rows 
 
     headers = []; // array of unique keys, for table header 
 
    
 
    // Use a RegEx to identify individual key:value pairs 
 
    while ((arr = re.exec(str)) !== null) { 
 
    var key = arr[1]; // $1 matches key 
 
    var value = arr[2]; // $2 matches value 
 
    // Check if we should start a new row 
 
    if (headers.indexOf(key) == 0) { 
 
     data.push(row); 
 
     row = []; 
 
    } 
 
    // Save this value in row 
 
    row.push(value); 
 
    // If this is the first time we've seen this key, add it to headers. 
 
    if (headers.indexOf(key) == -1) headers.push(key); 
 
    } 
 
    data.push(row); // save last row 
 
    data.unshift(headers); // add headers 
 

 
    return data; 
 
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Ничего себе, это выглядит красиво и решение для отправки данных формы html с массивом динамических списков. Спасибо! – Mars