【问题标题】:AppsScript function results in error "the coordinates of the range are outside the dimensions of the sheet"Apps 脚本功能导致错误“范围的坐标超出工作表的尺寸”
【发布时间】:2020-01-09 12:06:12
【问题描述】:

我必须在一张纸上垂直和水平地循环,然后将某些值复制到另一张纸上。问题是由于错误“范围的坐标超出了工作表的尺寸”而无法正常工作。它将出现在带有 getLastRow() 或 getLastColumn() 方法的行上。尝试使用 getLastRow() - 1 进行修复(在其他帖子中回复)但不起作用。

此外,没有用“”或类似的公式填充单元格,只是简单的文本。

代码:

function Ordenar_XT() {

  var leidas = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT");
  var relevado= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("A:A").getValues();
  var idTurma= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("B:B").getValues();
  var baseTrainers= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BASEXT");
  var baseContenido = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("BASECONTENIDO");


  var XT = leidas.getRange(1, 1, leidas.getLastRow() - 1, leidas.getLastColumn()).getValues();

  for(var i=1;i<leidas.getLastRow()+1;i++){

    if(relevado[i]!="Relevado"){

      for(var j=0;j < leidas.getLastColumn()-1;j++){

        if(XT[i][j]=="Estou deixando feedback sobre:" || XT[i][j]=="Estoy dejando feedback sobre:"){

          var last= baseTrainers.getLastRow()+1; 

          baseTrainers.getRange(last, 2).setValue(XT[i][j+1]);
          baseTrainers.getRange(last, 1).setValue(idTurma[i]);

          var formula = baseTrainers.getRange(1,8);

          formula.copyTo(baseTrainers.getRange(last, 8));


          var ok=true;
          var l = 2;
          while(ok && l <=10){

            switch(XT[i][j+l]){

              case "¿Qué tan satisfecho estás con tu XT?": 
              case "Quão satisfeito você ficou com seu XT?": baseTrainers.getRange(last, 3).setValue(XT[i][j+l+1]);
                break;

              case "¿El XT tiene dominio del tema?": 
              case "O XT tinha domínio do tema?": baseTrainers.getRange(last, 4).setValue(XT[i][j+l+1]);
                break;

              case "¿El XT explicó y comunicó los temas correctamente?": 
              case "O XT explicou bem os assuntos?": baseTrainers.getRange(last, 5).setValue(XT[i][j+l+1]);
                break;
              case "¿El XT fue abierto para evacuar dudas?": case "O XT foi aberto para tirar dúvidas?": baseTrainers.getRange(last, 6).setValue(XT[i][j+l+1]);
                break;
              case "¿La cantidad de práctica aplicada por el XT fue suficiente para aprender los procesos?" :
              case"A quantidade de prática aplicada pelo XT foi suficiente para aprender sobre os processos?": baseTrainers.getRange(last, 7).setValue(XT[i][j+l+1]);
                break;
              default: ok=false;
                break; 
            }                 
            l +=2;       
          }       
        }
      }     
    } 
  }  
}




编辑

感谢 Cooper,我添加了包含更改的代码部分:


var XT = leidas.getRange(1, 1, leidas.getLastRow() - 1, leidas.getLastColumn()).getValues();

  for(var i=0;i<XT.length;i++){

    if(relevado[i]!="Relevado"){

      for(var j=0;j < XT[i].length;j++){

        if(XT[i][j]=="Estou deixando feedback sobre:" || XT[i][j]=="Estoy dejando feedback sobre:"){

          var last= baseTrainers.getRange(); 

          baseTrainers.getRange(last, 2).setValue(XT[i][j+1]);
          baseTrainers.getRange(last, 1).setValue(idTurma[i]);

          var formula = baseTrainers.getRange(1,8);

          formula.copyTo(baseTrainers.getRange(last, 8));

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您的循环开始于 1 var i=1;i&lt;leidas.getLastRow()+1;i++

    但你的数据:

    var relevado= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("A:A").getValues();
    var idTurma= SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Base de datos REPXT").getRange("B:B").getValues();
    

    是二维数组的形式,所以总是会错过第一行数据,最后会用完数组元素。

    不要遍历行,而是尝试遍历数据。从零开始 for 循环或使用数组 forEach 方法。

    从这样的开始:

    for(var i=0;i<relevado.length;i++)
    

    还可以使用以下范围获取数据:getRange("A:A").getValues() 会导致数据末尾出现大量空值。尝试改用getRange(1,1,sh.getLastRow()).getValues()

    【讨论】:

    • 非常感谢@Cooper。这解决了行的问题,您将如何解决 getLastColumn 问题?并且在获取工作表上的最后一行时也会发生错误我也想复制数据,我必须知道最后一个 +1 因为这是要复制数据的行。
    • 您不应该使用列来增加数据数组。如果您循环遍历二维数据,则行循环为for(var i=0;i&lt;data.length;i++),列循环为for(var j=0;j&lt;data[i].length;i++),或者您可以使用data.forEach(r){r.foreach(c){})})
    • 成功了!谢谢!我现在无法解决的问题是获取要将数据复制到的工作表的最后一个空闲行: var last= baseTrainers.getLastRow()+1;有什么想法吗?
    • 更新了帖子!
    • 把这个var XT = leidas.getRange(1, 1, leidas.getLastRow() - 1, leidas.getLastColumn()).getValues()改成这个var XT = leidas.getRange(1, 1, leidas.getLastRow() , leidas.getLastColumn()).getValues()或更简单的var XT=leadas.getDataRange().getValues()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多