0

状況:

  • 20枚のスプレッドシートがあります。
  • 私は毎日他のスプレッドシートからこのスプレッドシートにシートをコピーする他のスクリプトを持っています-
  • 特定のスプレッドシートから特定のシートを毎日削除する必要があります。

問題:

シートをクリアするためにスクリプトが終了すると、スプレッドシートがハングし、スプレッドシートを終了して再入力する必要があります。

スプレッドシートをハングアップさせることなく、このスクリプトを調整して機能させることができる人がいれば幸いです。

脚本:

    function shellDeleteSheets(){
     var sheets = ['Sheet1','Sheet2','Sheet3','Sheet4','Sheet5']; 
     for (var s in sheets){
     deleteSheetName(sheets[s]);
      }
    }

      function deleteSheetName(stname) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getSheetByName(stname);
      if(!sh) {
        return;
      }
      ss.setActiveSheet(sh);
      ss.deleteActiveSheet();
      Utilities.sleep(400);
      SpreadsheetApp.flush();

    }
4

1 に答える 1

0

問題なく使用するこのバージョンを試してください

function DeleteSheets(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ['sheet1','sheet2','sheet3']; 
  var numberOfSheets = ss.getSheets().length;
  for(var s = numberOfSheets-1; s>0 ; s--){ // in my case I never delete the first sheet
    SpreadsheetApp.setActiveSheet(ss.getSheets()[s]);
    var shName = SpreadsheetApp.getActiveSheet().getName();

    if(sheets.indexOf(shName)>-1){
      var delSheet = ss.deleteActiveSheet();
      Utilities.sleep(500);
    }
  }
    SpreadsheetApp.setActiveSheet(ss.getSheets()[0]);// send me back to first sheet
}

もちろん、名前の配列を関数の引数として使用することも、保持する必要があるシートの名前を指定することもできます。この場合は if 条件が異なるだけです。スリープは400ミリ秒になる可能性がありますが、違いがあるかどうかはわかりません.500を使用するのは、ある時点でより信頼できることがわかったからです...そして、実際のソリューションを変更することはありません;-)


あなたのコメントに続いて編集してください:

「Updated」というシートをアクティブにするには、コードの最後の行を次のように変更します。

SpreadsheetApp.setActiveSheet(ss.getSheetByName('Updated'));

この行を元のコードのループの外に移動したことにも注意してください。この小さなエラーについては申し訳ありません^^

于 2013-06-21T19:41:59.247 に答える