谷歌电子表格脚本上的未定义错误

时间:2013-08-25 11:22:08

标签: google-apps-script google-sheets spreadsheet google-spreadsheet-api

我正在拼命寻找有关在Google电子表格上运行功能时遇到的错误的一些帮助。

我已经编写了所有代码,我遇到了两种情况:

  • 如果我从应该工作的工作表运行脚本,我会收到错误“糟糕 我们很抱歉。服务器遇到错误。请按“确定”刷新工作表“即使所有操作都在错误弹出窗口下方实际完成。

  • 如果我从另一个工作表运行脚本,脚本就会成功完成。

我认为这个问题可能与活动工作表功能有关,所以我开始调试以找到解决方案。我发现除了我要求电子表格对列进行一些操作的部分之外,我对所有代码都没有任何问题:首先创建一个新的,然后调整其中两个,最后删除一个。

我附上了所有代码,以便您可以更好地了解脚本正在做什么。

感谢您的关注。

function forecastSettimanale() {

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheets()[0];
    var data = sheet.getDataRange();

// I need to operate on a column that has TOT written on its top, and its 
// position can vary

    var k = 1;
    while (k <= data.getNumColumns()) {
      var startRange = sheet.getRange(1, k, 1);
      var value = startRange.getValue();
      if(value == 'TOT') { 
        var flagColumn = startRange.getColumn(); // 
      }
  k++;
  }

  sheet.insertColumnsBefore(flagColumn, 1);

  sheet.setColumnWidth(flagColumn - 1, 40);

  sheet.setColumnWidth(flagColumn, 50);

  sheet.deleteColumn(flagColumn - 6);

  sheet.setColumnWidth(flagColumn, 100);

}

带有您建议的新编辑代码:

function forecastSettimanale() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var data = sheet.getDataRange();

var searchElement = 'TOT';
var firstRow = 1, firstColumn = 1, rows = 1;

var lastColumn = sheet.getLastColumn();
var lastRow = sheet.getLastRow();
var range = sheet.getRange(firstRow, firstColumn, rows, lastColumn).getValues();
var flagColumn = range[0].lastIndexOf(searchElement) + 1;

sheet.setColumnWidth(flagColumn - 1, 40);
sheet.deleteColumn(flagColumn - 6);
sheet.insertColumns(flagColumn - 1);

var cellLeggiData = sheet.getRange(2, 3, 1);
var cellData = sheet.getRange(1, flagColumn - 1, 1);
cellData = cellData.setValue(cellLeggiData.getValue());


var last_row = sheet.getLastRow();
var copiaDa = sheet.getRange(2, flagColumn, last_row - 1);
var copiaA = sheet.getRange(2, flagColumn - 1, last_row - 1);
copiaDa.copyTo(copiaA, {contentsOnly: true});

for (var i = 35; i <= lastRow; i+=33) {
  var cellaFormula = sheet.getRange(i, flagColumn, 1);
  var rigaPrecedente = i - 1;
  var totN = sheet.getRange(rigaPrecedente, flagColumn, 1);
  var totFore = sheet.getRange(rigaPrecedente, flagColumn - 1, 1);
  var letteraColonna = String.fromCharCode(64 + flagColumn);
  var letteraColonnaMenoUno = String.fromCharCode(63 + flagColumn);
  cellaFormula.setFormula("=" + letteraColonnaMenoUno + rigaPrecedente + "-" + letteraColonna + rigaPrecedente);
}

sheet.setColumnWidth(flagColumn - 1, 100);

sheet.showColumns(flagColumn - 6, 6);

}

1 个答案:

答案 0 :(得分:0)

我无法重现这个问题。正如您所指出的那样,有问题的代码没有问题。也许您必须进行一些验证,例如sheet.deleteColumn(flagColumn - 6);如果flagColumn小于6,该怎么办?

我修改了一些获取所需列的方法。

/* CODE FOR DEMONSTRATION PURPOSES */
function forecastSettimanale() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var searchElement = 'TOT';
  var firstRow = 1, firstColumn = 1, rows = 1;

  var lastColumn = sheet.getLastColumn();
  var range = sheet.getRange(firstRow, firstColumn, rows, lastColumn).getValues();
  var flagColumn = range[0].lastIndexOf(searchElement);

  if (flagColumn > -1) {
    ++flagColumn;
    sheet.insertColumnsBefore(flagColumn, 1);
    sheet.setColumnWidth(flagColumn - 1, 40);
    sheet.setColumnWidth(flagColumn, 50);
    sheet.deleteColumn(flagColumn - 6);
    sheet.setColumnWidth(flagColumn, 100);
  }
}

尝试逐行调试以确定方法生成错误,这样就更容易找到解决方案。