Как записать массив в электронную таблицу. setValues ​​выбрасывает "невозможно преобразовать массив в объект" - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь записать свой массив в электронную таблицу, но я делаю что-то не так. Я прочитал много постов, в которых говорится, что я делаю, но это не работает. Смотрите мою последнюю строку кода ниже

в самой последней строке кода
'' 'Consol_sheet.getRange (2,1, х, 10) .setValues ​​(final_values);' '' Я получаю сообщение об ошибке, что я

"невозможно преобразовать массив в объект"

function iterateSheets() 
{
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('filesSheet');
  sh.clear();
  var folder=DriveApp.getFolderById('1axTLHOBPhl5_u7ngFOxViHg14OSw7pVC');//replace id with actual id of folder
  var files=folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  var consol_sheet = SpreadsheetApp.openById('18JnkQYa1L-FhXFmKJBrqJ6GI7BBO-V8QAVKP8PLLoXo').getActiveSheet();
  var x=2;
  var z=0;
  var final_values = new Array(50000);

while(files.hasNext())
 {
   var file=files.next();
    var ts=SpreadsheetApp.openById(file.getId());
    var allShts=ts.getSheets();

       for(var i=0;i<3;i++)   //allShts.length   
       {  
            var consol_values = allShts[i].getRange(8,1,40,26).getValues();  //.getRange(8, 1, 1, 1).getValues();
            var headers = allShts[i].getRange(7,6,1,20).getValues();  //.getRange(8, 1, 1, 1).getValues();
            var position= allShts[i].getRange("B1").getValue();
            var period = allShts[i].getRange("B2").getValue();
            var email = allShts[i].getRange("B3").getValue();    

         for (var z = 0;z<20;z++)//
         {   

           for (var y= 0;y<40;y++)              
           {          
               if (consol_values[y][i] != "")
               {
              /*  consol_sheet.getRange(x,1).setValue(consol_values[y][0]);  //AI pack 
                consol_sheet.getRange(x,3).setValue(consol_values[y][1]); //measure
                consol_sheet.getRange(x,4).setValue(email);
                consol_sheet.getRange(x,5).setValue(position);     


                final_values[x] = [];
                final_values[x][0]  =consol_values[y][0];  //AI pack 
                 //blank
                final_values[x][2]  =(consol_values[y][1]); //measure
                final_values[x][3]  =(email);
                final_values[x][4]  =(position);     
                final_values[x][5]  =(headers[0][z]);//location
                final_values[x][6]  =1;
                final_values[x][7]  =(period);
                final_values[x][8]  =(consol_values[y][3]); //price
                final_values[x][9]  =(consol_values[y][z+5]); //fcst

                if (consol_values[y][z+5] != "")
                { 
                    final_values[x][10] =(consol_values[y][25]); //fcst value             
                }                          


                x = Number(x)+1  //row count for consolidation output

              }
          }          
         }    
      }
    }


consol_sheet.getRange(2,1,x,10).setValues(final_values);

 }

Этот форум очень помог мне в этом, сейчас у меня есть еще одно препятствие, чтобы закончить этот проект.

Ответы [ 3 ]

3 голосов
/ 17 июня 2019

Аргумент setValues должен быть массивом массивов (2D Array), где все внутренние массивы имеют одинаковое количество элементов, и эти элементы должны быть строками, числами или объектами Date, не может быть пустых элементов.

Примечание:

Если ваш массив выглядит так

[
  [1,,'orange'], // 2nd element of this inner array is empty
  , // 2nd element of the outer array is empty
  [] // This array is empty
]

добавьте недостающие внутренние массивы и '' на каждое "пустое место" внутренних массивов. Полученный массив должен выглядеть так:

[
  [1,'','orange'],
  ['','',''],
  ['','','']
]

(добавить пустую строку '' на каждое пустое место элемента).

Относящиеся

0 голосов
/ 17 июня 2019

Рассматривали ли вы возможность внесения изменений в исходный массив 2d, который вы извлекли, consol_values?Таким образом, вы будете знать, что у вас столько же элементов, сколько вы ожидаете.Вы можете начать свои циклы где-нибудь, кроме 0/1, в зависимости от того, какие значения из оригинала вы хотите игнорировать (в этом случае ваша область извлечения не совсем совпадает с областью записи).

0 голосов
/ 17 июня 2019

Запись строк и столбцов в электронную таблицу

Вот простая функция, которая записывает строки и столбцы в электронную таблицу.

function writeRowColToSpreadsheet() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  sh.clear();
  var rg=sh.getRange(1,1,25,25);
  var vA=rg.getValues();
  for(var i=0;i<vA.length;i++) {
    for(var j=0;j<vA[i].length;j++) {
      vA[i][j]=Utilities.formatString('%s,%s', i+1,j+1);
    }
  }
  rg.setValues(vA);
}
...