【问题标题】:How to write array out to spreadsheet. setValues throws "cannot convert array to object"如何将数组写入电子表格。 setValues 抛出“无法将数组转换为对象”
【发布时间】:2019-10-31 07:56:34
【问题描述】:

我正在尝试将我的数组写入电子表格,但我做错了。我读过很多帖子说要做我正在做的事情,但它不起作用。请看下面我的最后一行代码

在代码的最后一行
'''consol_sheet.getRange(2,1,x,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);

 }

这个论坛对我达到这一点非常有帮助,现在我在这里完成这个项目还有一个障碍。

【问题讨论】:

  • x 从 2 开始。0、1 和 2 发生了什么? final_values[0] 将是 undefined,索引 1 和 2 也是如此。并且必须有 50k 个元素,因为您已声明此数组有 50k 个元素。
  • 设置 x = 0 解决了我的长度问题。我现在将在空白处工作。
  • 只需将其声明为空数组即可。 var final_values = []
  • 我在我的代码中这样做了,所以我猜现在空白是我的问题。

标签: javascript multidimensional-array google-apps-script google-sheets


【解决方案1】:

setValues 的参数应该是一个数组数组(二维数组),其中所有内部数组具有相同数量的元素,并且这些元素应该是字符串、数字或 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'],
  ['','',''],
  ['','','']
]

(在每个空元素位置添加一个空字符串'')。

相关

【讨论】:

  • 非常感谢您的意见,我觉得我所做的正是此链接中提供的内容。当您说没有空元素时,由于数据的性质,我有很多空元素。我不确定我是否可以消除它们,但我会尝试一下。
  • @datafarmer 我在答案中添加了注释。希望它能让我想说的更清楚。
  • 我认为最好的方法是编写这样的公式—— if (consol_values[y][0].length != 0 ) {consol_values[y][0];} else {"";} 但是当我将这个 = 设置为一个变量时,我得到一个错误。您如何建议我将空白值写入空数组元素??
【解决方案2】:

您是否考虑过对您提取的原始二维数组 consol_values 进行修改?这样你就会知道你有你期望的相同数量的元素。您可以在 0/1 以外的位置开始循环,具体取决于您要忽略的原始值(在这种情况下,您的拉取区域与写入区域不太一样)。

【讨论】:

    【解决方案3】:

    将行和列写入电子表格

    这是一个将行和列写入电子表格的简单函数。

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

    【讨论】:

    • Cooper,感谢您的输入我已经尝试了这个确切的代码,并在 getRange final_value[0] 的第二部分得到错误,这就是我硬编码该值的原因。我得到的错误是 TypeError: Cannot read property "length" from undefined.
    • 这意味着你肯定没有二维数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多