0

Google スプレッドシートで関数を実行しているときに発生し続けるエラーについて、必死に助けを求めています。

私はすべてのコードを書きましたが、次の 2 つの状況が発生します。

  • スクリプトが機能するはずのシートからスクリプトを実行すると、すべての操作が実際に完了しているにもかかわらず、「申し訳ありません。サーバーでエラーが発生しました。「OK」を押してシートを更新してください」というエラーが表示されます。エラーポップアップの下。

  • 別のシートからスクリプトを実行すると、スクリプトは正常に完了します。

この問題は、アクティブ シート機能に関連している可能性があると考えたので、解決策を見つけるためにデバッグを開始しました。スプレッドシートに列に対していくつかの操作を行うように要求する部分を除いて、すべてのコードでまったく問題がないことに気付きました。最初に新しい列を作成し、次にそれらの 2 つのサイズを変更し、最終的に 1 つを削除します。

スクリプトの動作をよりよく理解できるように、すべてのコードを添付します。

ご清聴ありがとうございました。

トニー

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 に答える