0

カレンダーから予定を読み込むスプレッドシートに Google スクリプトがあります。予定に費やす時間を計算します。しかし、カレンダー アイテムの更新には非常に時間がかかり、タイムアウト エラーが頻繁に発生します。カレンダーから予定を取得することは問題ではありません。スクリプトの下に記載されている、スプレッドシートの 10 個のタブごとにあるクエリは、速度を低下させていますか?

function updateUren()
{

  var cal = CalendarApp.openByName("Uren");
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Uren");

  //set first row
  var details=[["title", "date", "start", "end", "duration"]]; // events[i].getDescription(),
  var range=sheet.getRange(2,1,1,5);
  range.setValues(details);

  //gets the year from Boekjaar
  var year = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Boekjaar").getRange(2,1,1,1).getValue();

  var events = cal.getEvents(new Date("January 1, "+year), new Date("December 31, "+year));
  if(events.length == 0)
  {
    Browser.msgBox('No events found for year: "' + year + '"');
  }
  for (var i=0;i<events.length;i++) {
    //http://www.google.com/google-d-s/scripts/class_calendarevent.html
    var startTime = events[i].getStartTime();
    var endTime = events[i].getEndTime();
    var durationHours = (endTime - startTime) / (1000*60*60);
    var details=[[events[i].getTitle(), startTime, startTime, endTime, durationHours]]; // events[i].getDescription(),
    var row=i+3;
    range=sheet.getRange(row,1,1,5);
    range.setValues(details);
  }
  var foo = "foo";
}

ここに示すクエリを実行している 10 個のタブがあります。特定の期間の予定期間をフィルタリングします

=QUERY (Uren!A:E, "SELECT B, SUM(E) WHERE A CONTAINS 'SomeKeyWord' AND B>=DATETIME '2012-6-18 00:00:00'
AND B<DATETIME '2012-7-16 00:00:00' GROUP BY B PIVOT A'")

それらは高価で、 updateUren() 関数の呼び出し中に処理が遅くなりますか?

誰も答えを知っていますか?

4

1 に答える 1

1

データにアクセスする QUERY 関数がそれと関係があるかどうかはわかりませんが (そうかもしれません)、ループ内で get/set を実行しないことがベスト プラクティスであると理解しています。代わりに、最初に配列を構築してから、1 回の setValues() 呼び出しで設定します。

function updateUren()
{

  var cal = CalendarApp.openByName("Uren");
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Uren");

  //create first row of 2D array
  var details=[["title", "date", "start", "end", "duration"]]; // events[i].getDescription(),

  //gets the year from Boekjaar
  var year = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Boekjaar").getRange(2,1,1,1).getValue();

  var events = cal.getEvents(new Date("January 1, "+year), new Date("December 31, "+year));
  if(events.length == 0)
  {
    Browser.msgBox('No events found for year: "' + year + '"');
  }

  for (var i=0;i<events.length;i++) {
    //http://www.google.com/google-d-s/scripts/class_calendarevent.html
    var startTime = events[i].getStartTime();
    var endTime = events[i].getEndTime();
    var durationHours = (endTime - startTime) / (1000*60*60);
    details.push([events[i].getTitle(), startTime, startTime, endTime, durationHours]); // events[i].getDescription(),
  }
  sheet.getRange(2, 1, details.length, 5).setValues(details);
  //var foo = "foo";
}

編集:ループ内でカレンダーサービスを呼び出していますが。これはテストされていませんが、違いがあるかどうかを知りたいと思います.

于 2012-07-31T22:19:11.047 に答える