Google Apps脚本 - 从电子表格到非默认日历创建日历事件的问题

时间:2018-04-10 17:17:36

标签: google-apps-script google-sheets google-calendar-api

我今年早些时候创建了一个脚本,用于从电子表格行创建日历事件,将其放在共享的家庭日历和我自己的辅助日历上。

它在今年早些时候运行良好,但现在不是添加到辅助日历,而是仅添加到我的默认日历中,我根本没有编写到脚本中。

根据ID调用日历的语法是否有所改变?

//push new events to calendar
function pushToCalendar() {

  //spreadsheet variables
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var now = new Date();
  var currentYear = Utilities.formatDate(new Date(now.getTime()), 'America/Chicago', 'yyyy');
  var currentSheet = ("Events" + " " + currentYear);
  var sheet = book.getSheetByName(currentSheet);
  var lastRow = sheet.getLastRow(); 
  var lastCol = sheet.getLastColumn();
  var range = sheet.getRange(2,1,lastRow,lastCol);
  var values = range.getValues();

      //calendar variables
      var calendar = CalendarApp.getCalendarById('sample1@group.calendar.google.com');
      var calendarShared = CalendarApp.getCalendarById('sample2@group.calendar.google.com');

      var numValues = 0;
      for (var i = 0; i < values.length; i++) {     
        //check to see if values 0,1,3,4,5,6 are filled out
      if ((values[i][0]) && (values[i][1]) && (values[i][3]) && (values[i][4]) && (values[i][5]) && (values[i][6])) 
      {

          //check if it's been entered before  (values[i][8] = '')||(values[i][8] = null)  
          if (values[i][7].toString().toLowerCase() !== 'y') { 

            //create event https://developers.google.com/apps-script/class_calendarapp#createEvent
            var newEventTitle = 'Game: ' + values[i][0] + ' - ' + values[i][1];
            var newSharedTitle = 'Adam - Game: ' + values[i][0] + ' - ' + values[i][1];
            var startDay = Utilities.formatDate(new Date(values[i][3]), 'America/Chicago', 'MMMM dd, yyyy');
            var startTime = Utilities.formatDate(new Date(values[i][4]), 'America/Chicago', 'HH:mm');
            var start = startDay + ' ' + startTime;
            var endDay = Utilities.formatDate(new Date(values[i][5]), 'America/Chicago', 'MMMM dd, yyyy');
            var endTime = Utilities.formatDate(new Date(values[i][6]), 'America/Chicago', 'HH:mm');
            var end = endDay+ ' ' + endTime;
            var details = values[i][9] + ' - $' + values[i][10] + '\n' + '\n' + 'Crew: ' + '\n' + values[i][14] + '\n' + values[i][15] + '\n' + values[i][16] + '\n' + '\n' +'Assessor:' + '\n' + values[i][17];

            //new event on Secondary AND Shared Calendar
            var newEvent = calendar.createEvent(newEventTitle, new Date(start), new Date(end), {location: values[i][13], description: details});
            var newSharedEvent = calendarShared.createEvent(newSharedTitle, new Date(start), new Date(end), {location: values[i][13], description: details});
            //get ID
            var newEventId = newEvent.getId();

            //mark as entered, enter ID
            sheet.getRange(i+2,8).setValue('y');
            sheet.getRange(i+2,9).setValue(newEventId);

          } 
        else;
        }

        numValues++;
      }

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

尝试创建活动,然后将其插入您的日历,如下所示:

unit SQLUnit;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, stdctrls, ADODB, DB, comobj;

type
  TSQLWork = class(TForm)
     ADOQuery: TADOQuery;
     ADOConnection: TADOConnection;
     ADOCommand: TADOCommand;
     Button1: TButton;
     procedure createtables;
     procedure createdatabase;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
  SQLWork: TSQLWork;

implementation

{$R *.dfm}
procedure TSQLWork.createtables;
begin
  showmessage('Tables being created');
  ADOCommand.CommandText:='CREATE TABLE Student (StudentID real, '+
    'StudentName char(30), primary key(StudentID))';
  ADOCommand.Execute;
  showmessage('Tables created!');
end;

procedure TSQLWork.Button1Click(Sender: TObject);
begin
  createdatabase;
end;

procedure TSQLWork.createdatabase;
var dbase:OLEVariant;
    name:string;
begin
  name:='Test5.accdb';
  if not fileexists(name) then
  begin
    showmessage('DOES NOT EXIST CONFIRMED');
    dbase:=CreateOleObject('ADOX.Catalog');
    dbase.create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+name+';');
    dbase:=null;
    showmessage('CREATED CONFIRMED');
    createtables;
  end
  else
    showmessage('EXISTS CONFIRMED');
  ADOCommand.ConnectionString:='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+name+';';
  showmessage('CONNECTED');
end;

end.

答案 1 :(得分:0)

我也遇到了同样的 ID 问题......显然你需要摆脱事件 ID 本身的 @google.com 部分,然后将其作为数组的一部分

.getId().split('@')[0];

只需添加此代码,它对我来说就像一个魅力