3

カレンダーにイベントを追加する方法を理解しましたが、その後、既存のイベントを編集する方法を理解するために8時間も費やしました(または、いずれかの方法でイベントを削除すると、作業が完了します)。これが私が持っているものです:

function UpdateEventTime() {
  var cal = CalendarApp.getCalendarById("semehjawioe@group.calendar.google.com");
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 1;  // First row of data to process
  var numRows = 1;   // Number of rows to process
  var dataRange = sheet.getRange(startRow, 5, numRows, 5);
  var data = dataRange.getValues();


//  var oldtstart = SpreadsheetApp.getActiveSheet().getRange('G2');
//  var oldtstop = SpreadsheetApp.getActiveSheet().getRange('H2');
// ??????????????????????????????????????????????????
// ??  How do I call up and delete the old event?  ??  
// ??????????????????????????????????????????????????  



  for (i in data) {
    var row = data[i];
    var title = row[0];  // First column
    var desc = row[1];       // Second column
    var tstart = row[2];
    var tstop = row[3];
    var loc = row[4];
    cal.createEvent(title, tstart, tstop, {description:desc,location:loc});
    SpreadsheetApp.getActiveSheet().getRange('G2').setValue(tstart);
    SpreadsheetApp.getActiveSheet().getRange('H2').setValue(tstop);
 }
}

オンラインドキュメントで私が言えることから、イベントをプルアップすることはできません。日付範囲内のすべてのイベントをプルアップすることしかできません。そのため、コードの最後で、開始時刻と終了時刻をスプレッドシートに保存し、次にスクリプトが実行されるときにそれを参照しようとします。真ん中のコメントアウトされたセクションは私が迷子になっているところです。ここで、前回スクリプトを実行したときに追加したイベントを呼び出そうとしています。編集するか、削除する必要があります。

助けてください。

4

4 に答える 4

6

イベントIDをそれらの詳細とともにスプレッドシートに保存できればより良いでしょう。これらのイベントを変更または削除する必要がある場合は、ID でイベントをフェッチして処理を実行します。

修正コード 保存用

var event = cal.createEvent(title, tstart, tstop, {description:desc,location:loc});
var eventid = event.getId();
SpreadsheetApp.getActiveSheet().getRange('I2').setValue(eventid);

後でイベントを取得するには

var id = SpreadsheetApp.getActiveSheet().getRange('I2');
var cal = CalendarApp.getCalendarById("semehjawioe@group.calendar.google.com");
var event = cal.getEventSeriesById(id);
//Now modify or delete the event
event.addEmailReminder(minutesBefore);
event.addGuest(email);
event.deleteEvent();
.
.
.

これがあなたを助けることを願っています

于 2012-10-22T07:20:22.473 に答える
3

ここに私がまとめた進行中の作業があります。まだ微調整する必要がありますが、コードの最適化に関する洞察を持っている人や、役に立つと思う人のために投稿すると思いました。基本的に、コードはカレンダーから配列を作成し、スプレッドシートはそれらを結合します。最終変更日 (イベントの最終更新日、およびスプレッドシートの標準のスクリプト化された最終変更列) で並べ替え、重複を削除し、カレンダー (現在はすべてのイベントを削除した後) とスプレッドシートの両方に送信します。キーを追加して、キーを入力して両方の場所からアイテムを削除するリストを用意することを計画していました。利点は、カレンダーからスプレッドシートの行を追加したり、その逆を行ったりできることです。有益なご意見をお寄せいただきありがとうございます。

function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [ {name: "Sync Spreadsheet to Calendar", functionName: "calsync"}];
//{name: “Sync”, functionName: “myimport”}];
ss.addMenu(“Calendar Sync”, menuEntries);
}

function calsync()
{
// This function should be executed from the
// spreadsheet you want to export to the calendar
var mySpreadsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Test123″);

var myCalendar = CalendarApp.openByName(“Test”);

//calendar event array
var events = myCalendar.getEvents(new Date(“January 1, 2011 EST”),
new Date(“January 1, 2014 EST”));
if (events[0]) {
var eventarray = new Array();
var line = new Array();
line.push(‘Title’);
line.push(‘Start Date’);
line.push(‘End Date’);
line.push(‘Description’);
line.push(‘Last Modified’);
eventarray.push(line);

var i = 0;
for (i = 0; i < events.length; i++) {
line = new Array();
line.push(events[i].getTitle());
line.push(events[i].getStartTime());
line.push(events[i].getEndTime());
line.push(events[i].getDescription());
line.push(events[i].getLastUpdated());
//line.push(events[i].getLocation());
eventarray.push(line);
}
} else {
Browser.msgBox('nothing between ' + startDate + ' till ' + endDate);
}

var dataRange = mySpreadsheet.getRange("A2:E53");
var data = dataRange.getValues();

if (data[0]) {
var dataarray = new Array();
var line2 = new Array();

var j = 0;
for (j = 0; j < data.length; j++) {
var row = data[j];
line2 = new Array();
line2.push(row[0]);
line2.push(row[1]);
line2.push(row[2]);
line2.push(row[3]);
line2.push(row[4]);
//line.push(events[i].getLocation());
//line.push((events[i].getEndTime() – events[i].getStartTime()) / 3600000);
dataarray.push(line2);
}
} else {
Browser.msgBox('nothing between ' + startDate + ' till ' + endDate);
}

var newarray = eventarray.concat(dataarray);
uniquedata(newarray);

}

//found at https://developers.google.com/apps-script/articles/removing_duplicates
function uniquedata(data) {
var newData = new Array();
var data2 = sort(data, 4, false);
for(i in data2){
var row = data2[i];
var duplicate = false;
for(j in newData){
if(row[0] == newData[j][0]){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
var filtered = sort(newData, 4 , false);
UpdateSpreadsheet(filtered);
UpdateCalendar(filtered);
// var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test123");
// sheet.clearContents();
// sheet.getRange(1, 1, filtered.length, filtered[0].length).setValues(filtered);
}

function UpdateSpreadsheet(data) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test123");
sheet.clearContents();
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

function UpdateCalendar(data)
{
var myCalendar = CalendarApp.openByName("Test");

// optional – delete existing events
var events = myCalendar.getEvents(new Date("January 1, 2011 EST"),
new Date("January 1, 2013 EST"));
for (var i = 0; i 0) {
if (typeof columnIndex != “number” || columnIndex > data[0].length) {
throw ‘Choose a valide column index’;
}
var r = new Array();
var areDates = true;
for (var i = 0; i < data.length; i++) {
var date = new Date(data[i][columnIndex]);
if (isNaN(date.getYear()) && data[i][columnIndex] != '') areDates = false;
else if (data[i][columnIndex] != '') data[i][columnIndex] = date;
r.push(data[i]);
}
return r.sort(function (a, b) {
if (ascOrDesc) return ((a[columnIndex] b[columnIndex]) ? 1 : 0));
return ((a[columnIndex] > b[columnIndex]) ? -1 : ((a[columnIndex] < b[columnIndex]) ? 1 : 0));
});
}
else {
return data;
}
}
于 2012-10-22T20:33:32.127 に答える
1

人々が将来これを探している場合に備えて、Waqar の提案を統合した後の最終的なコードを次に示します。できます。新しいイベントを作成すると、eventID が取得され、スプレッドシートのセル I2 に保存されます。その eventID に基づいてイベントを見つけ、それを削除し、新しいものに置き換えることによって、既存のイベントを「更新」します。

  function CreateOrReplaceEvent() {
  var cal = CalendarApp.getCalendarById("xxxxxxxxxxxxx@group.calendar.google.com");
  var id = SpreadsheetApp.getActiveSheet().getRange('I2').getValue();

  if(id != 0){
  var event = cal.getEventSeriesById(id);
  event.deleteEventSeries();
  }

  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 1;  // First row of data to process
  var numRows = 1;   // Number of rows to process
  var dataRange = sheet.getRange(startRow, 5, numRows, 5);
  var data = dataRange.getValues();

  for (i in data) {
    var row = data[i];
    var title = row[0];  // First column
    var desc = row[1];       // Second column
    var tstart = row[2];
    var tstop = row[3];
    var loc = row[4];
    var event = cal.createEvent(title, tstart, tstop, {description:desc,location:loc});
    var eventid = event.getId();
    SpreadsheetApp.getActiveSheet().getRange('I2').setValue(eventid);
    }
}
于 2012-10-22T20:20:37.260 に答える
1

編集:Waqarが彼の答えを投稿している間、私は自分の答えを書いていました...それは一種の繰り返しですが、例を得るために投稿します...

ID を使用してイベントにアクセスできます。これは、ゲストをカレンダー イベントに追加する例です。また、結果を示すログ シートも更新します。

function sendinvites(e) {
  var ss = SpreadsheetApp.openById('0AnZ5_Sh________UJnVlFtNDM2NUE')
  var sh = ss.getSheets()[0]
  var logsheet = ss.getSheets()[1]
  var last = ss.getLastRow();
  var FUS1=new Date().toString().substr(25,8);
  var calendar_name = 'test'
  var group = GroupsManager.getGroup('groupemail');
  var members = group.getAllMembers();
  var startDate = new Date(e.parameter.start);
  var endDate = new Date(e.parameter.end);
  var Calendar = CalendarApp.getCalendarsByName(calendar_name);
  var sheetName = calendar_name + "-du-" + Utilities.formatDate(e.parameter.start, FUS1, "dd-MMM-yyyy")
      + "-au-" + Utilities.formatDate(e.parameter.end, FUS1, "dd-MMM-yyyy")  
// 
  var events = Calendar[0].getEvents(startDate , endDate);
  if (events[0]) {
    var eventarray = new Array();
    var line = new Array();
    line.push('Titre : '+calendar_name,'Début ','Fin','Localisation','Durée','invités');
    eventarray.push(line);

    for (i = 0; i < events.length; i++) {
        var ID = events[i].getId()
    var lr = logsheet.getLastRow();
      logsheet.getRange(lr+1,1).setValue(events[i].getTitle()+' / '+Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy"));
      for(nn=0;nn<members.length;++nn){
        logsheet.getRange(lr+1,nn+2).setValue(members[nn]);  
        Calendar[0].getEventSeriesById(ID).addGuest(members[nn])
      }
      line = new Array();
      line.push(events[i].getTitle());
      line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getStartTime(), FUS1, "HH:mm"));
      line.push(Utilities.formatDate(events[i].getEndTime(), FUS1, "dd-MMM-yyyy")+' à ' +Utilities.formatDate(events[i].getEndTime(), FUS1, "HH:mm"));
      line.push(events[i].getLocation());
      line.push((events[i].getEndTime() - events[i].getStartTime()) / 3600000);
      var invitelist='';
      var list = Calendar[0].getEventSeriesById(ID).getGuestList()
          for(nn=0;nn<list.length;++nn){invitelist+=list[nn].getName()+', '}
      line.push(invitelist)
      eventarray.push(line);
    }
    Logger.log(eventarray)
    var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
    sheet.getRange(1,1,eventarray.length,eventarray[0].length).setValues(eventarray);
    sheet.getRange(1,1,1,eventarray[0].length).setBackgroundColor('#ffffcc');
    sheet.setColumnWidth(1, 450);sheet.setColumnWidth(2, 150);sheet.setColumnWidth(3, 150);sheet.setColumnWidth(4, 250);sheet.setColumnWidth(5, 75);sheet.setColumnWidth(6, 450);;
    sheet.setFrozenRows(1)
  } else {
    var startstring = Utilities.formatDate(e.parameter.start, FUS1, "dd-MMM-yyyy");
    var endstring = Utilities.formatDate(e.parameter.end, FUS1, "dd-MMM-yyyy");
    Browser.msgBox('Aucun événement entre le ' + startstring + ' et le ' + endstring +' dans votre agenda :'+calendar_name);
  }
}
于 2012-10-22T07:29:57.243 に答える