Alex T
Alex T

Reputation: 45

Cannot call method "push" of undefined

I'm trying to make a spreadsheet to upload products in Prestashop by .csv. Everything works like a charm, but now I need to be able to make some changes in already entered products with the same spreadsheet. The only thing I came up with is to manipulate text strings from a cell into a variable array (after that I'll find a way to go forward).

Firstly I managed to combine about ~100 cells into one cell (which I accomplished with a complicated formula) but now I need the text from this cell to be separated and temporarily stored in an array variable. This is the formula. It's joining columns in rows with a : separator and then joins those rows with a ; separator and in the end I just needed a number:

=regexreplace(regexreplace(regexreplace(concatenate(arrayformula(if($A$13:$A$50="","",if($C$13:$C$50="","",$A$13:$A$50&":"&$C$13:$C$50&if($D$13:$D$50="","",$D$13:$D$50)&":"&(ROW($A$13:$A$50)-12)&";"))))," :",":"),": ",":"),"\+","-")

This resulted in this text:

Producător:GARMIN:1;Tip:Ceas inteligent:3;Model:Vivomove HR Premium:4;Culoare:Gold:5;Culoare curea:Light brown:6;Greutate:56.5g:8;Rezolutie display:64x128:9;Tip ecran:OLED:10;GPS:Da:15;Bluetooth:Da:16;Durata in regim de asteptare (ore):168:24;Sensori:Heart RATE, Activity Tracker, Barometric altimeter, Accelerometer, Smart notifications, Weather, Step counter, Move bar, Calories burned, Floors climbed, Analog hands:26;Garanție:24luni:38;


Now I need to separate everything back as it was, but by a code in Apps Script, so that I will be able to manipulate the values separately, but they would still be in a structured form. It should be something like this (inside a two dimensional variable):

[0][0]Producător    [0][1]GARMIN
[1][0]Tip   [1][1]Ceas inteligent
[2][0]Model [2][1]Vivomove HR Premium
[3][0]Culoare   [3][1]Gold
[4][0]Culoare curea [4][1]Light brown
[5][0]Greutate  [5][1]56.5g
[6][0]Rezolutie display [6][1]64x128
[7][0]Tip ecran [7][1]OLED
[8][0]GPS   [8][1]Da
[9][0]Bluetooth [9][1]Da
[10][0]Durata in regim de asteptare (ore)   [10][1]168
[11][0]Sensori  [11][1]Heart RATE, Activity Tracker, Barometric altimeter, Accelerometer, Smart notifications, Weather, Step counter, Move bar, Calories burned, Floors climbed, Analog hands
[12][0]Garanție [12][1]24luni

And now the main part... The next code is breaking with the error Cannot call method "push" of undefined

//var ss = SpreadsheetApp.getActiveSpreadsheet();
//var activeSheet = ss.getActiveSheet();
//var idSpreadsheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1zRsGMoXJzG9oht_pr3Rr24ksPqBzTZIvNcYPUKfphNI/edit#gid=1264546658").getSheetByName("RO").getDataRange().getValues();
//var idToChange = activeSheet.getRange("A12").getValue();
var row = 0;
//var userID = Session.getActiveUser();
var bufferFeatures = [{}];
bufferFeatures = idSpreadsheet[10][29];
var bufferImages = idSpreadsheet[row][27];
//var productRows = bufferFeatures.indexOf(";",0);
var testColumn = [];
var pos = 0; //here is where we start the text string
var del = 0; //here is where we find the ";" delimiter and stop slicing text string
// THIS FOR LOOP WORKS FINE
for (pos = 0; pos < bufferFeatures.length; pos = del) {
  del = bufferFeatures.indexOf(";", pos);
  testColumn.push(bufferFeatures.slice(pos, del));
  del++;
};
var rownr = 0; //current row number.. not really using this variable
var pos1 = 0; //here is where we start the text string
var del1 = 0; //here is where we find the ":" delimiter and stop slicing text string

var columnsAndRows = [];
columnsAndRows.push([]);

var j = 0;

//THIS FOR LOOP GIVES ME TROUBLE
for (var x = 0; x <= testColumn.length; x++) {

  for (pos1 = 0; pos1 + 1 < testColumn[x].length; pos1 = pos1) {

    del1 = testColumn[j].indexOf(":", del1);

    var theSlice = testColumn[j].slice(pos1, del1);
    var theStop = testColumn[j].length;


    //for some reason, I can't get this code to "push" j=2)
    Logger.log("Adding " + theSlice);

    columnsAndRows[j].push(theSlice);
    del1++;
    pos1 = del1;
    Logger.log("Added")
  }
  Logger.log("Next row");
  del1 = 0
  j++;
  //rownr++;
};

Upvotes: 1

Views: 448

Answers (1)

TheMaster
TheMaster

Reputation: 50406

You need to declare columnsAndRows[j] as a array too.

columnsAndRows[j] = [];

Using split() would be much easier:

function strToArr(string) {
  if (!string) {
    var string = "Producător:GARMIN:1;Tip:Ceas inteligent:3;Model:Vivomove HR Premium:4;Culoare:Gold:5;Culoare curea:Light brown:6;Greutate:56.5g:8;Rezolutie display:64x128:9;Tip ecran:OLED:10;GPS:Da:15;Bluetooth:Da:16;Durata in regim de asteptare (ore):168:24;Sensori:Heart RATE, Activity Tracker, Barometric altimeter, Accelerometer, Smart notifications, Weather, Step counter, Move bar, Calories burned, Floors climbed, Analog hands:26;Garanție:24luni:38; "
    }
  var arr1 = string.substr(0, string.lastIndexOf(";")).split(';'); //split by ;
  var arr2 = arr1.map(function(e) { return e.split(':').slice(0,2)}); //split each element of arr1 by : and return only the first two elements
  Logger.log(arr2);
  return arr2;
}

Upvotes: 1

Related Questions