javascript - 来自多个文本框的多个 Google 事件

标签 javascript google-apps-script google-calendar-api

我正在尝试创建一个表单,在多个文本框中保存多个 Google 日历事件,用户应该能够添加另一个文本框来保存另一个事件。创建每个文本框时,其名称将从最后一个开始递增,例如textbox1、textbox2 等。下面的代码显示了我到目前为止的代码,我似乎无法使其工作。任何建议将不胜感激。

function doGet(){

 var app = UiApp.createApplication().setTitle('QuickAdd Events');
 //Create a penel which holds all the form elelemnts
 var parent = app.createHorizontalPanel().setId('parent');
 var left = app.createVerticalPanel().setId('left').setWidth(200);
 var right = app.createVerticalPanel().setId('right');

 var noOfEvents = app.createTextBox().setName('noOfEvents').setValue(1).setWidth(30); 

 var eventTitleLabel = app.createLabel('Event Title:');
 var eventTitle = app.createTextBox().setName('eventTitle').setWidth(200);  
 var eventButton = app.createButton('Create Events');
 var childButton = app.createButton('+ Event');

 left.add(noOfEvents)
     .add(eventTitleLabel)
     .add(eventTitle);

 right.add(eventButton)
      .add(childButton);

 var eventHandler = app.createServerClickHandler('createEvents');
 eventHandler.addCallbackElement(left);
 eventButton.addClickHandler(eventHandler); 

 var panelHandler = app.createServerClickHandler('createAnotherEvent');
 panelHandler.addCallbackElement(left);
 childButton.addClickHandler(panelHandler);

 parent.add(left)
       .add(right);

 app.add(parent);
 app.close();
 return app;
}


function createAnotherEvent(e){
 var app = UiApp.getActiveApplication();

 var numberOfEvents = app.getElementById("noOfEvents");
 numberOfEvents++;
 app.getElementById('noOfEvents').setValue(numberOfEvents);
 var eventTitleLabel = app.createLabel('Event Title:');
 var eventTitle = app.createTextBox().setName('eventTitle'+numberOfEvents).setWidth(200);
 //the new textBox has a new predictable name and you can easily get it in the handler

 app.getElementById('left').add(eventTitleLabel)
                           .add(eventTitle);
 return app;
}

function createEvents(e){
 Logger.log(JSON.stringify(e));
 var app = UiApp.getActiveApplication();

 try{
  var numberOfEvents = Number(e.parameter.noOfEvents);
  for (var i = 1; i < numberOfEvents; i++) {

   var event = e.parameter[eventTitle+i];;

   var cal = CalendarApp.getDefaultCalendar();
   cal.createEventFromDescription(event);

   app.add(app.createLabel('Event created Successfully'));
   }
   //make the form panel invisible
  app.getElementById('parent').setVisible(false);
  return app;
 }

 //If an error occurs, show it on the panel
 catch(e){
  app.add(app.createLabel('Error occured: '+e));
  return app;
 }
}

最佳答案

(我现在没有时间检查所有内容,但这是我看到的错误...)

在此函数中:

function createAnotherEvent(e){
 var app = UiApp.getActiveApplication();

 var numberOfEvents = app.getElementById("noOfEvents"); 

您正在尝试获取小部件中的值,但您得到的是小部件本身(作为 UiApp 对象),因此您不能使用 numberOfEvents++; 这是一种数字方法。 .

要获取小部件值,请使用var numberOfEvents = Number(e.parameter.numberOfEvents); 因为 e.parameter.numberOfEvents 实际上是一个字符串。

如果该字符串中有非十进制值,您可以使用简单的正则表达式轻松删除它,如下所示: var numberOfEvents = Number(e.parameter.numberOfEvents.replace(/\D/g,'')); ,这样您就可以确保只有数字会作为值传递。

<小时/>

编辑

找到时间进一步...

这是代码的工作版本...确实有一些细节阻止了它的工作:

  • noOfEvent 缺少 ID
  • eventTitle 的名称不正确(应该添加一个数字,因为稍后您用数字设置了Name
  • 获取 'var event = e.parameter['eventTitle'+i];' ,您忘记了构建名称的“”

    function doGet(){
    
     var app = UiApp.createApplication().setTitle('QuickAdd Events');
     //Create a penel which holds all the form elelemnts
     var parent = app.createHorizontalPanel().setId('parent');
     var left = app.createVerticalPanel().setId('left').setWidth(200);
     var right = app.createVerticalPanel().setId('right');
    
     var noOfEvents = app.createTextBox().setName('noOfEvents').setId('noOfEvents').setValue(1).setWidth(30); 
    
     var eventTitleLabel = app.createLabel('Event Title:');
     var eventTitle = app.createTextBox().setName('eventTitle1').setWidth(200);  
     var eventButton = app.createButton('Create Events');
     var childButton = app.createButton('+ Event');
    
     left.add(noOfEvents)
         .add(eventTitleLabel)
         .add(eventTitle);
    
     right.add(eventButton)
          .add(childButton);
    
     var eventHandler = app.createServerClickHandler('createEvents');
     eventHandler.addCallbackElement(left);
     eventButton.addClickHandler(eventHandler); 
    
     var panelHandler = app.createServerClickHandler('createAnotherEvent');
     panelHandler.addCallbackElement(left);
     childButton.addClickHandler(panelHandler);
    
     parent.add(left)
           .add(right);
    
     app.add(parent);
     app.close();
     return app;
    }
    
    function createAnotherEvent(e){
     var app = UiApp.getActiveApplication();
     var noOfEvents = Number(e.parameter.noOfEvents.replace(/\D/g,''));;
     noOfEvents++;
     app.getElementById('noOfEvents').setValue(noOfEvents);
     var eventTitleLabel = app.createLabel('Event Title:');
     var eventTitle = app.createTextBox().setName('eventTitle'+noOfEvents).setWidth(200);
     //the new textBox has a new predictable name and you can easily get it in the handler
    
     app.getElementById('left').add(eventTitleLabel)
                               .add(eventTitle);
     return app;
    }
    
    function createEvents(e){
     Logger.log(JSON.stringify(e));
     var app = UiApp.getActiveApplication();
    
     try{
      var noOfEvents = Number(e.parameter.noOfEvents.replace(/\D/g,''));;
      for (var i = 1; i <= noOfEvents; i++) {
    
       var event = e.parameter['eventTitle'+i];;
    
       var cal = CalendarApp.getDefaultCalendar();
       cal.createEventFromDescription(event);
    
       app.add(app.createLabel('Event created Successfully'));
       }
       //make the form panel invisible
      app.getElementById('parent').setVisible(false);
      return app;
     }
    
     //If an error occurs, show it on the panel
     catch(e){
      app.add(app.createLabel('Error occured: '+e));
      return app;   }     
    

    }

关于javascript - 来自多个文本框的多个 Google 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22580185/

相关文章:

javascript - 如何使用 SWFObject 检测闪光灯

javascript - jquery 日期选择器 : Change position of prev and next buttons

javascript - react : How optimize a custom hook that shares data?

javascript - App Script 调试成功但执行失败,为什么?

ruby-on-rails - 从 ruby​​ 访问谷歌日历的最佳方式是什么?

php - 将 Google 日历与 SQL 数据库同步(以及其他方式)?

php - 禁用表单中选定提交按钮的回车键

javascript - Google 应用程序脚本,不能包含 css

php - Google App Script 将电子邮件从 gmail 获取到第三方应用程序

ruby-on-rails - 如何从指定日期从谷歌日历中删除所有事件?