Как разделить запятые значения в одной ячейке на разные столбцы в Google листе с помощью GScript? - PullRequest
1 голос
/ 20 февраля 2020

enter image description here Содержите вышеуказанные данные в одной ячейке листа google sheet1. Необходимо привести его к отдельным столбцам в листе 2.

categories: ScreenGuard item_meta: {'Brand': 'Lenovo', 'Series': 'Z', 'Model': '7r883', 'Length (mm)': '134', 'Width (mm)': '132', 'Total Area (sq mm)': '17688', '_measurement_data': '{"length":"{\\"value\\":\\"134\\",\\"unit\\":\\"mm\\"}","width":"{\\"value\\":\\"132\\",\\"unit\\":\\"mm\\"}","_measurement_needed":"17688","_measurement_needed_unit":"sq mm"}'} line_subtotal: 176.88 line_subtotal_tax: 0.00 line_tax: 0.00 line_total: 176.88 name: Screen Guard product_id: 10 quantity: 1 sku:  tags:  tax_class:  type: simple unit_price: 176.88 variation_id: 0

это можно повторить в той же ячейке или на листе для большего количества примеров

https://docs.google.com/spreadsheets/d/1NTqAi361vmaVQhgjWhs0y7oEZcb7K09W9unEE12nOkI/edit?usp=sharing

нужны значения Марка, Серия, Модель, Длина, Ширина в следующем листе. Можно ли это сделать с помощью формул?

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Опираясь на ответ, данный Тиммером , я построил функцию, которая разбивает значения и публикует их в разные столбцы на втором листе.

Здесь вы go:

function split_values(){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName("Original_Data");        //Your original Sheet Name
  var sheet2 = ss.getSheetByName("Product_Measurement"); //Your modified Sheet Name
  var cellRange = sheet.getDataRange();
  var cellValues = sheet.getDataRange().getValues();  //All values from original sheet.

  var arrayItems = [];
  var array_to_print = [];
  cellValues.forEach(function(row, index) {
    //Uncomment the below line if in sheet 1 we have header row that needs to be ignored.
    //if (index !== 0) {                                      
      var cell = sheet.getRange(index+1, 2)
      if(cell.getValue() != "Success"){                //Check if we have already parsed this row
        cell.setValue("Success")                       //If not, parse it and set status as Success.
      var split_item = row[0].split(/item_meta: /g);
      for(var i=1;i<split_item.length;i++){
        var item = split_item[i].split(/, 'Total Area/)[0].split(/, 'Total Area/)[0].replace(/'/g,'"')+ '}';
        item = JSON.parse(item);
        arrayItems.push(item);                         //Add all the split prdoducts to an Array.
      //} Uncomment for header.
      }}
  });

  //Add only required details to the array that needs to be put in different columns.
  for (var i = 0; i < arrayItems.length ; i++) {
    array_to_print.push([arrayItems[i].Brand,arrayItems[i].Series,arrayItems[i].Model,arrayItems[i]['Length (mm)'],arrayItems[i]['Width (mm)'],"Success"]) 
  }
  
  //Print the array in the Modified sheet.
  if(array_to_print.length>0){
       sheet2.getRange(sheet2.getLastRow()+1, 1,array_to_print.length,6).setValues(array_to_print);
  }
}

В листе я также добавил несколько пунктов меню и создал третий лист для сдвига элементов успеха. Вы можете запустить функции из пункта меню «Функции скрипта Google».

Надеюсь, это вам поможет!

1 голос
/ 20 февраля 2020

Что-то вроде этого в качестве первого шага?

function vanDikHoutZaagtMenPlanken(){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName("sheet1");
  var cellValue = sheet.getRange("A3").getValue();

  var arrayItems = [];
  var hlpItems = cellValue.split(/item_meta: /g);

  for(var i=1;i<hlpItems.length;i++){

    var item = hlpItems[i].split(/, 'Total Area/)[0].split(/, 'Total Area/)[0].replace(/'/g,'"')+ '}';
    item = JSON.parse(item);
    arrayItems.push(item);

  }

  //Edit -> Looping through the result to get every value needed

  for (var i = 0; i < arrayItems.length ; i++) {

    Logger.log(arrayItems[i])
    Logger.log(arrayItems[i].Brand)
    Logger.log(arrayItems[i].Series)
    Logger.log(arrayItems[i].Model)
    Logger.log(arrayItems[i]['Length (mm)']) 
    Logger.log(arrayItems[i]['Width (mm)'])
    Logger.log("================================")

    // This is an example on how to set a value to the sheet2

    ss.getSheetByName("sheet2").getRange('B5').setValue(arrayItems[i].Brand);

  }

}

Проверьте следующие ссылки, чтобы узнать, как использовать:

getRange (a1Notation) : чтобы получить ячейки, с которыми вам нужно работать.

getLastRow () : Возвращает позицию последней строки с содержимым.

setValue (значение) : Для установки значения в ячейку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...