0

好的,所以我用 Google Apps Script 深入了解了一下。在工作中,我们有一周的固定时间轮班。三种类型的班次可以是早班(上午 7 点至下午 3.30)、中班(上午 8 点至下午 5 点)和晚班(上午 10.30 至晚上 7 点)。

我要做的是生成一个带有日期选择器和 3 个按钮的 UI,每个班次一个。这个想法是您在日期选择器上单击星期一,然后单击一个班次按钮,它会生成 5 个班次(一周中的每一天一个班次)并将它们作为事件添加到我的 Google 日历中。

我可以获得生成事件的函数,但我无法将日期选择器的输入与每个函数的日期联系起来。有什么方法可以分割事件的日期和时间吗?理想情况下,时间将“硬编码”到脚本中,因此无法更改,但用户可以选择日期。

我希望这一切都有意义,代码如下:

// loads the UI
function doGet() {
  var app = UiApp.createApplication();

  var label1 = app.createLabel("To use this application, select a Monday and then hit the Early Middle or Late button");
   app.add(label1);
  var label2 = app.createLabel("5 events will be created from the start date across five days");
   app.add(label2);

   var picker = app.createDatePicker().setId("picker");
   var handler = app.createServerHandler("change");
    app.add(picker);

  var button1 = app.createButton("Early").setId("button1");
   button1.addClickHandler(app.createServerHandler("early"));
   app.add(button1);

   var button2 = app.createButton("Middle").setId("button2");
    button2.addClickHandler(app.createServerHandler("middle"));
   app.add(button2);

  var button3 = app.createButton("Late").setId("button3");
   button3.addClickHandler(app.createServerHandler("late"));
   app.add(button3);

   return app;
};

//Handles date picker changes
 function change(eventInfo) {
   var app = UiApp.getActiveApplication();
   app.add(app.createLabel("The value of the date picker changed to " +     eventInfo.parameter.picker));
  return app;
};


//Generates the events
 function early(){
  var cal = CalendarApp.getDefaultCalendar();
  var title = "Computacenter";
  var start = new Date("July 21, 2012 07:00:00");  
  var end = new Date("July 21, 2012 15:30:00");
  var loc = "Unspecified";
  var recurrence = CalendarApp.newRecurrence().addDailyRule().times(5);

  var event = cal.createEventSeries(title, start, end, recurrence, {location : loc});

};


function middle(){

  var cal = CalendarApp.getDefaultCalendar();
  var title = "Computacenter";
  var start = new Date("July 21, 2012 08:30:00");
  var end = new Date("July 21, 2012 17:00:00");
  var loc = "Unspecified";
  var recurrence = CalendarApp.newRecurrence().addDailyRule().times(5);

  var event = cal.createEventSeries(title, start, end, recurrence, {location : loc});

};


function late(){

  var cal = CalendarApp.getDefaultCalendar();
  var title = "Computacenter";
  var start = new Date("July 21, 2012 10:30:00");
  var end = new Date("July 21, 2012 19:00:00");
  var loc = "Unspecified";
  var recurrence = CalendarApp.newRecurrence().addDailyRule().times(5);

  var event = cal.createEventSeries(title, start, end, recurrence, {location : loc});

 };
4

3 回答 3

0

好的 - 有一个称为回调元素的东西,您必须将其添加到您的服务器处理程序中。

因此,理想情况下,我不会直接添加所有 UI 元素,而是创建一个面板并添加到面板中。就像是

var panel = app.createVerticalPanel().setId('panel'); 
app.add(panel); 
/* .... */
panel.add(picker); 
/* and the like... */

button2.addClickHandler(app.createServerHandler("middle").addCallbackElement(panel));

使用它,您应该能够使用 eventInfo.parameter.picker 在日期选择器中选择日期

于 2012-07-17T09:04:48.597 回答
0

这是您修改后的代码

// loads the UI
function doGet() {
  var app = UiApp.createApplication();

  var container = app.createVerticalPanel();

  var label1 = app.createLabel("To use this application, select a Monday and then hit the Early Middle or Late button");
   container.add(label1);
  var label2 = app.createLabel("5 events will be created from the start date across five days");
   container.add(label2);

   var picker = app.createDatePicker().setId("picker");
   var handler = app.createServerHandler("change");
  picker.addValueChangeHandler(handler);
    container.add(picker);

  var button1 = app.createButton("Early").setId("button1");
   button1.addClickHandler(app.createServerHandler("generateEvents").addCallbackElement(container));
   container.add(button1);

   var button2 = app.createButton("Middle").setId("button2");
    button2.addClickHandler(app.createServerHandler("generateEvents").addCallbackElement(container));
   container.add(button2);

  var button3 = app.createButton("Late").setId("button3");
   button3.addClickHandler(app.createServerHandler("generateEvents").addCallbackElement(container));
   container.add(button3);

  app.add(container);

   return app;
};

//Handles date picker changes
 function change(eventInfo) {
   Logger.log(eventInfo);
   var app = UiApp.getActiveApplication();
   app.add(app.createLabel("The value of the date picker changed to " +     eventInfo.parameter.picker));
  return app;
};


//Generates the events
 function generateEvents(e){
   var source = e.parameter.source;
   var date = e.parameter.picker.getDate();
   var month = e.parameter.picker.getMonth(); 
   var year = e.parameter.picker.getFullYear();

   var startTime;
   var endTime;

   //(7am - 3.30pm), Middles (8.30am to 5pm) and Lates (10.30am to 7pm).
   if(source == 'button1'){
     var startTime = '07:00';
     var endTime = '15:30';
   }

   //Middle events time
   if(source == 'button2'){
     var startTime = '08:30';
     var endTime = '17:00';
   }

   //Late events time
   if(source == 'button3'){
     var startTime = '10:30';
     var endTime = '19:00';
   }

  var cal = CalendarApp.getDefaultCalendar();
  var title = "Computacenter";
   //Using format new Date(year, month, day, hours, minutes, seconds); 
  var start = new Date(year, month, date, parseInt(startTime.substring(0,2)), parseInt(startTime.subString(3,5)));
  var end = new Date(year, month, date, parseInt(endTime.substring(0,2)), parseInt(endTime.subString(3,5)));
  var loc = "Unspecified";
  var recurrence = CalendarApp.newRecurrence().addDailyRule().times(5);

  var event = cal.createEventSeries(title, start, end, recurrence, {location : loc});

};
于 2012-07-17T09:40:44.420 回答
0

恐怕您选择的方法将无法使用,至少不是非常用户友好,也不是“傻瓜证明”。(即使使用回调元素)。你会发现很难避免有人选择了错误的组合。

我建议使用 3 个单选按钮或一个 listBox 用于小时班次和一个日期选择器用于日期。单选按钮中的小时将是字符串,您可以轻松地将其转换为可以与日期结合的开始时间/结束时间。此外,如果您想在几周内工作,日期选择器也不是最好的解决方案,因为人们可以选择一周中的任何一天,如果我理解你的话,选择的日期应该始终是星期一以便系统工作不是吗?

我有一个关于日期和时间片的情况几乎相同的应用程序,你可以看看它,看看它是如何工作的,我认为它至少在它的方法上可以很好地适合你的用例,它为每个人提供了一个选择星期几,但这个选择可以减少到一个。该脚本也显示在此处。随时询问您是否需要更多详细信息。

编辑: Waqar 的回答是在我写作的时候出现的,他的建议离我不远 ;-) 并解决了几乎所有问题......只需考虑更换日期选择器,以找到拒绝任何“非星期一”选择的方法!

编辑 2:要获得正确的时间和日期,您可以这样做(使用 Number() 将字符串转换为数字):

   var date = Number(e.parameter.picker.getDate());
   var month =Number(e.parameter.picker.getMonth()); 
   var year = Number(e.parameter.picker.getFullYear());
...
...
       var st = startTime.split(':');// returns an array of 2 string elements
           var stH=Number(st[0]);
           var stM=Number(st[1]) ;              
       var et = endTime.split(':')
           var etH=Number(et[0]);
           var etM=Number(et[1]) ;              
       //Using format new Date(year, month, day, hours, minutes, seconds, milliseconds); 
      var start = new Date(year,month,date,stH,stM,0,0);
      var end = new Date(year,month,date,etH,etM,0,0);
       Logger.log(start+'   '+end)
      var loc = "Unspecified";
      var recurrence = CalendarApp.newRecurrence().addDailyRule().times(5);

      var event = cal.createEventSeries(title, start, end, recurrence, {location : loc});

或者,一直保持字符串:

   var startstring = year+','+month+','+date+','+startTime.replace(':',',')+', 00,000'
   var endstring =  year+','+month+','+date+','+endTime.replace(':',',')+', 00,000'
   Logger.log('start = '+startstring+'      end = '+endstring)
   var st = startstring.split(',')
   var et = endstring.split(',')

   var start = new Date(st[0],st[1],st[2],st[3],st[4],st[5],st[6]);
   var end = new Date(et[0],et[1],et[2],et[3],et[4],et[5],et[6]);
   Logger.log(start+'   '+end)
于 2012-07-17T09:43:23.723 回答