【问题标题】:setValues cannot convert array to object[][]setValues 无法将数组转换为对象[][]
【发布时间】:2017-04-11 11:33:25
【问题描述】:

我一直在 google 应用程序脚本上对此进行编码:

  function basePesa(){
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("aux");
  var unique = sheet.getRange("C1").setFormula("=unique(A:A)");
 var Avals = sheet.getRange("C1:C").getValues();
 var Alast = Avals.filter(String).length;
 var transp = sheet.getDataRange().getValues();

 var ss = SpreadsheetApp.openById("14Y3xiAa9kdoK_YO_tAVN-YWC9RE1EANV5wm8Ez1sa1o");
 var base =ss.getSheetByName("Base PESA");
 var values = base.getDataRange().getValues();
 var newdata = new Array(values.length);
 var y = 0;

//  Browser.msgBox(transp.length);

 for(var i=0;i<Alast;i++){


 var tra = Avals[i][0];

 for(var x =1; x<values.length;x++){

 if(values[x][18] == tra){
  newdata[y] = new Array(values[0].length);

 for(var p=0; p<values[0].length;p++)
 newdata[y][p] = values[x][p];   

 y++;
 }

 }   

  }
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bco de Dados").getRange("A2:AZ"+(y+1)+"").setValues(newdata);
// Browser.msgBox(newdata);


}

似乎我无法将数组写入范围。我检查了范围是否匹配,并且我确定这个数组是二维数组。有什么指示吗?

提前致谢!

【问题讨论】:

  • 你在调试模式下看到你的阵列是什么样子了吗?
  • 是的,它看起来像一个二维数组。imgur.com/a/Vh3pB
  • 您能给我们一些访问权限以供测试使用吗?
  • 我之前尝试过,我想我不能,因为我在一个工作组中,只有其中的人可以通过共享访问... :( 我会尝试在另一个上重新创建它帐户,等等
  • 顺便说一句,试试看:drive.google.com/…

标签: arrays google-apps-script google-sheets


【解决方案1】:

数组 1: [ A , B , C ]

数组 2: [ [A] , [B] , [C] ]

数组 3: [ [ A , B , C ] , [ A , B , C ] , [ A , B , C ] ]

**需要注意的是,较大数组(在本例中为 3)中每个较小数组的宽度必须与每个较小数组相同。

Click Here for a Visual Example (Image)

【讨论】:

  • 现在我终于解决了 setValues 的老问题,3 个数组图片示例太棒了!非常感谢
  • @user8637437:图中数组 1 和数组 2 的例子是倒置的。
【解决方案2】:

新数据数组的创建似乎是个问题。这是一个正在运行的示例(我将错误代码放在注释中):

function basePesa(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("aux");
  var unique = sheet.getRange("C1").setFormula("=unique(A:A)");
  var Avals = sheet.getRange("C1:C").getValues();
  var Alast = Avals.filter(String).length;
  var transp = sheet.getDataRange().getValues();

  var ss = SpreadsheetApp.openById("14Y3xiAa9kdoK_YO_tAVN-YWC9RE1EANV5wm8Ez1sa1o");
  var base =ss.getSheetByName("Base PESA");
  var values = base.getDataRange().getValues();
  var newdata = [];//new Array(values.length);
  var y = 0;

  //  Browser.msgBox(transp.length);

  for(var i=0;i<Alast;i++){


    var tra = Avals[i][0];

    for(var x =1; x<values.length;x++){

      if(values[x][18] == tra){
        //newdata[y] = new Array(values[0].length);

        var test = [];

        for(var p=0; p<values[0].length;p++)
        {
          test.push(values[x][p]);
          //newdata[y][p] = values[x][p].toString(); 
        }

        newdata.push(test);

        y++;
      }

    }   

  }

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bco de Dados").getRange("A2:AZ"+(y+1)+"").setValues(newdata);

  // Browser.msgBox(newdata);

}

【讨论】:

  • 伙计,非常感谢,你真棒!即使我不明白为什么那个旧代码不起作用,你的代码当然是受欢迎的!
  • 看看这个SO question,可能有解释。
【解决方案3】:

基于我遇到的类似问题,我猜在你遇到的最后一行

SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Bco de Dados").getRange("A2:AZ"+(y+1)+"").setValues(newdata);

而不是

.setValues(newdata);

你应该使用

.setValues([newdata]);

注意方括号!此解决方案与

基本相同(但更短)
...
var newdata = []
var test = []
...
test.push(values[x][p]
...
newdata.push(test)
...
....setValues(newdata)

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2020-02-10
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2021-05-03
    • 2018-12-04
    相关资源
    最近更新 更多