3

私はこのスクリプトを使用して、Googleカレンダーからスプレッドシートにデータをプルしています。改善のためにいくつか質問があります。

  1. 複数のカレンダーから同じスプレッドシートにデータを相互に上書きせずにプルすることは可能ですか?
  2. 各行がどのカレンダーからのものであるかを示すデータの新しい列をスプレッドシートに追加することは可能ですか?
  3. また、24時間ごとに自動的に実行されるようにこれを設定するにはどうすればよいですか?

ありがとう!

function caltest3(){
  var ss = SpreadsheetApp.openById("SPREADSHEET ID");
  SpreadsheetApp.setActiveSpreadsheet(ss);
  var cal=CalendarApp.getCalendarById("CALENDAR ID");
  var sheet = SpreadsheetApp.getActiveSheet();

  var events = cal.getEvents(new Date("January 1, 2013"), new Date("January 13, 2013"));
for (var i=0;i<events.length;i++) {
  //http://www.google.com/google-d-s/scripts/class_calendarevent.html
      var details=[[events[i].getTitle(), events[i].getStartTime(),            
                    events[i].getEndTime(), events[i].getDescription(),
                    events[i].getLocation()]];
  var row=i+1;
  var range=sheet.getRange(row+1,1,1,5);
  range.setValues(details);
    }
  }
}
4

1 に答える 1

3

短い答えと例:

  1. への 1 回の呼び出しでこれを行うことはできませんがCalendarApp、calendarIds のリストをループして、そのカレンダーの結果のイベントを配列に追加すると、この配列を並べ替えてスプレッドシートに配置できます。
  2. カレンダー名 (または ID) を別の項目としてdetails配列に追加するだけです。範囲列の数を1
  3. 任意の期間にスクリプト トリガーを追加します。ドキュメントでこれが最もよく説明されています。

getRange()複数のカレンダーからカレンダー イベントの配列を作成する場合でも、1 つのカレンダーからカレンダー イベントの配列を作成する場合でも、 &setValuesメソッドを呼び出すたびに行ごとに書き込むよりも、それらをループ内の配列に追加し、ループ外でスプレッドシートに書き込む方が適切です。これらは別個の API 呼び出しであり、これらの呼び出しは、Apps Script の時間において最もコストがかかります。データに適した範囲でそれぞれを 1 回だけ呼び出すと、スクリプトは桁違いに速く実行されます。

以下のスクリプトは、回答 1 と 2 を示しています。これにタイマーを設定している場合、クエリを実行している期間に影響を与えたい場合は、ニーズが異なる場合があります。

function caltest3(){

  var ss = SpreadsheetApp.openById( 'spreadsheetId' ),
      sheet = ss.getSheetByName( 'sheetName' ),
      cals = ['id1', 'id2', 'id3'], c, cal, calName,
      start = new Date( 'whenever' ), end = new Date( 'whenever' ),
      events, i, details,
      eventslog = [], e,
      rows = [], range;

  for (c = 0; c < cals.length; c += 1) {

    cal = CalendarApp.getCalendarById(cals[c]);
    calName = cal.getTitle();
    events = cal.getEvents(start, end);

    // add the events of the current calendar to the array of all events
    eventslog = eventslog.concat(
      events.map(function(event) {
        return {
          time: new Date(event.getStartTime()).getTime(), // sort by this
          details: [
            event.getTitle(),
            event.getStartTime(),
            event.getEndTime(),
            event.getDescription(),
            event.getLocation(),
            calName // change calendar info position in array to suit
          ]
        };
      })
    );
  }

  // sort array of event so date order can be either way by reversing a & b
  eventslog.sort(function(a, b) { return a.time - b.time; });

  rows = eventslog.map(function(entry) { return entry.details; });

  range = sheet.getRange(2, 1, rows.length, 6);
  range.setValues(rows);
}

わかりやすくするためにコードの間隔を空けています

于 2013-01-20T00:09:40.137 に答える