0

こんにちはstackoverflowコミュニティ、

私は現在、チームの毎日のタスクに毎週Googleスプレッドシートを使用してダッシュボードを作成しようとしています。週の終わりまでに、チームメンバーはダッシュボードシートを「リセット」する必要がありますが、次のスクリプトで問題が発生しています。スクリプトは「TEMPLATE」シートを複製し、古いダッシュボードを削除して、新しいコピーの名前を「Dashboard」に変更する必要があります。

function resetDashboard() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('TEMPLATE');
  sheet.copyTo(ss).setName('New Dashboard');
  ss.setActiveSheet(ss.getSheetByName('Dashboard'));
  ss.deleteActiveSheet();
  ss.setActiveSheet(ss.getSheetByName('New Dashboard'));
  ss.renameActiveSheet('Dashboard');
}

注:「ダッシュボード」シートは、スプレッドシートで表示される唯一のシートです。

これまでのところ、このスクリプトは正常に機能しています。スプレッドシートをリロードしても、まだ機能しています。

私の問題は、スプレッドシートを閉じてGoogleDocsの概要から再度開くと、スクリプトは「テンプレート」シートを複製するだけで、残りの関数は実行されないということです。

これはバグですか?使用できる「よりクリーンな」バージョン/スクリプトはありますか?

よろしく、リュディガー

4

2 に答える 2

2

問題は、「瞬間的に」同じ名前のシートが2枚あることだと思います。名前を変更するSpreadsheetApp.flush()前に、仕事に影響を与える可能性があります。これを試して:

function resetDashboard() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = ss.getSheetByName('TEMPLATE').copyTo(ss);
  ss.setActiveSheet(ss.getSheetByName('Master'));
  ss.deleteActiveSheet();
  SpreadsheetApp.flush(); //this guarantees that the old sheet is deleted before we proceed
  newSheet.setName('Master');
  ss.setActiveSheet(newSheet);
}
于 2012-08-02T21:03:34.843 に答える
0

flush()関数に関するアドバイスをありがとうございます。問題は解決しませんでしたが、両方のスクリプトが機能しなかった本当の理由を見つけました(実際には機能しましたが、気づかなかっただけです)。

deleteActiveSheet()これは、この関数ですでに報告されている問題です。

問題1298:deleteActiveSheet()およびcopyTo()が確実に機能するには、.sleep(2000)が必要です。

現時点での唯一の回避策は、Utilities.sleep()関数のようです。例はここにあります。

私をこれに導いたあなたの助けに感謝します。:)

乾杯、リュディガー

于 2012-08-03T11:55:31.040 に答える