bugfix> javascript > 投稿

このようなスプレッドシートとシートを使用するのは間違っていますか?

function ADD_COLUMN() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('B:B').activate();
  spreadsheet.getActiveSheet().insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 1);
  spreadsheet.getActiveRange().offset(0, 0, spreadsheet.getActiveRange().getNumRows(), 1).activate();
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    sheet.getRange(1,2).setValue(sheet.getRange(1,3).getValue()+1);
    var addedDateAndTime = Utilities.formatDate(new Date, ss.getSpreadsheetTimeZone(), "MMMM yyyy");
    sheet.getRange(2,2).setValue(addedDateAndTime)
};

このスクリプトは、A列とB列の間に列を追加し、(C1--bew列が作成される前のこのセルはB1- + 1)の値をB1に挿入し、現在の日付(月と年)をB2に挿入します。

私はスクリプトにあまり詳しくなく、他のスクリプトのビットからこれを作成したので、このスクリプトが間違っている場合、誰かが簡単な方法でなぜ間違っているのか説明できますか?

回答 2 件
  • 「間」に列を追加する場合 A そして B 次に、上記の値を挿入すると、以下のコードを確認することでメリットが得られる場合があります。

    function ADD_COLUMN() {
      let spreadsheet = SpreadsheetApp.getActive();
      let sheet = spreadsheet.getActiveSheet();
      sheet.insertColumns(2, 1);
      sheet.getRange(1,2).setValue(sheet.getRange(1,3).getValue()+1);
      var addedDateAndTime = Utilities.formatDate(new Date, spreadsheet.getSpreadsheetTimeZone(), "MMMM yyyy");
      sheet.getRange(2,2).setValue(addedDateAndTime)
    }
    
    

    ただし、最も注目すべき変更点は、Apps Scriptのベストプラクティスによると、サービスを1回だけ呼び出すのが最善であるという事実です。したがって、 spreadsheet そして sheet 。また、あなただけがしたいので列を挿入します、シートから範囲をアクティブにする必要はありません。

    参照

    Apps Script ベストプラクティス。

  • 説明/問題:

    ロジックの問題は、AとBの前に列を追加するため、セルに属する値を追加することです。 C1 にシフトします D1 。次に、使用するとき sheet.getRange(1,3) セルの新しい値を取得します C1 それはあなたが望むものではないかもしれません。列の値を取得することをお勧めします 3 さらに、その前に追加する列の数:

    sheet.getRange(1,3+columnsToAdd)

    このように、以前の値 C1 セルの値を計算するために使用されます B1

    Google Apps Scriptでは、データをコピーまたは貼り付けるためにアクティブな範囲やシートを設定する必要はありません。これら setActive メソッドは、自動的に作成されたマクロによって使用され、スクリプトのステップを表示します。 ui 、しかし、別の理由がない限り、それらはほとんど必要ありません。

    SpreadsheetオブジェクトとSheetは2つのインスタンスです異なるクラス。彼らは異なる方法を使用することを意味します。私が提供したリンクのドキュメントを読んで、各インスタンスが使用される理由とそのシナリオを確認してください。

    解決:
    function ADD_COLUMN() {
        const ss = SpreadsheetApp.getActiveSpreadsheet();
        const sheet = ss.getActiveSheet();
        const columnsToAdd = 1; 
        ss.insertColumnsBefore(2, columnsToAdd);
        sheet.getRange(1,2).setValue(sheet.getRange(1,3+columnsToAdd).getValue()+1);
        const addedDateAndTime = Utilities.formatDate(new Date, ss.getSpreadsheetTimeZone(), "MMMM yyyy");
        sheet.getRange(2,2).setValue(addedDateAndTime);
    };
    
    

あなたの答え