无法调用未定义的方法 "push"

Cannot call method "push" of undefined

我正在尝试制作电子表格以通过 .csv 在 Prestashop 中上传产品。一切都很顺利,但现在我需要能够使用同一个电子表格对已输入的产品进行一些更改。我唯一想到的就是将单元格中的文本字符串操作到变量数组中(之后我会找到前进的方法)。

首先,我设法将大约 100 个单元格合并为一个单元格(这是我用一个复杂的公式完成的),但现在我需要将这个单元格中的文本分开并临时存储在一个数组变量中。 这是公式。它使用 : 分隔符连接行中的列,然后使用 ; 分隔符连接这些行,最后我只需要一个数字:

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

这导致了这个文本:

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;


现在我需要将所有内容按原样分开,但是通过 Apps 脚本中的代码,这样我就可以单独操作这些值,但它们仍然是结构化的形式。 它应该是这样的(在一个二维变量中):

[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

现在是主要部分...下一个代码因错误 无法调用未定义的方法 "push"

而中断

//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++;
};

您也需要将 columnsAndRows[j] 声明为数组。

columnsAndRows[j] = [];

使用split()会容易得多:

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;
}