0

我正在拼命地寻求有关在 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);

}
4

1 回答 1

0

我无法重现该问题。正如您所指出的,有问题的代码可以正常工作。也许您必须进行一些验证,例如在sheet.deleteColumn(flagColumn - 6);What if flagColumnis less than 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);
  }
}

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

于 2013-08-25T13:04:42.793 回答