0

わかりましたので、Google Apps Script の深いところに少し飛び込みました。職場では、決まった時間の週単位のシフトがあります。シフトには、アーリー (午前 7 時~午後 3 時 30 分)、ミドル (午前 8 時 30 分~午後 5 時)、レイト (午前 10 時 30 分~午後 7 時) の 3 つのタイプがあります。

私がやろうとしているのは、日付ピッカーと 3 つのボタン (シフトごとに 1 つ) を備えた UI を生成することです。アイデアは、日付ピッカーで月曜日をクリックしてからシフト ボタンをクリックすると、5 つのシフト (曜日ごとに 1 つ) が生成され、イベントとして 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

あなたが選択したアプローチは使用できないのではないかと思います。少なくとも、あまりユーザーフレンドリーではなく、「絶対確実」でもありません(コールバック要素を使用した場合でも)。誰かが間違った組み合わせを選択することを避けるのは非常に難しいでしょう。

時間シフトには3つのラジオボタンまたはlistBoxを使用し、日付には日付ピッカーを使用することをお勧めします。ラジオボタンの時間は、日付と組み合わせることができる開始時刻/終了時刻に簡単に変換できる文字列になります。また、日付ピッカーは、週の任意の曜日を選択できるため、週で作業する場合は最適なソリューションではありません。よく理解している場合は、システムが機能するために、選択した日は常に月曜日である必要があります。

日付とタイムスライスに関してほぼ同じ状況のアプリケーションがあります。それを見て、どのように機能するかを確認できます。少なくともそのアプローチでは、ユースケースに非常に適していると思います。曜日ですが、この選択は1つに減らすことができます。スクリプトもここに表示されます。詳細が必要な場合は、お気軽にお問い合わせください。

編集: 私が書いている間に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 に答える
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 に答える