運用当番を決めるプログラム

# 組み合わせ決め
``` kujibiki.java
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;

public class Kujibiki{
   static final String DELIMITTER = " & ";
   static final String NEW_LINE = "\n";
   private static JTextArea  jl1;
   private static JLabel  jl2;
   private static JButton  button;
   private static JButton  clearButton;

   public static void main(String[] args) {

      //フレーム表示
      JFrame f = new JFrame("チーム運用当番くじ引きー");
      
      //各パーツを作る
      jl1 = new JTextArea();
      jl2 = new JLabel("改行区切りで入力してちょんまげ");
      button = new JButton("抽選開始");
      clearButton = new JButton("クリア");
      
      //イベント登録
      addEvent();

      //コンテンツ区画の取得
      Container cont =  f.getContentPane();
      //パーツをコンテンツに追加する
      cont.add(jl2,BorderLayout.NORTH);
      cont.add(jl1,BorderLayout.CENTER);
      cont.add(button,BorderLayout.EAST);
      cont.add(clearButton,BorderLayout.SOUTH);
   	
      //フレームのサイズを指定
      f.setSize(250, 400);
      //フレームの表示・非表示を指定
      f.setVisible(true);
      //×を押した時の処理
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      //描画
      f.show();
   }
   
   static void addEvent(){
      //クリックイベント登録
      button.addMouseListener(
        new java.awt.event.MouseAdapter(){
          public void mouseClicked(java.awt.event.MouseEvent event){
            //バリデート
            if(isTextNg()){
              jl1.setText("ちゃんと入力してね〜" + NEW_LINE);
              jl1.append("例)" + NEW_LINE + "鈴木" + NEW_LINE + "佐藤");
              return;
            }

            //入力値取得
            java.util.List<String> list = getText();
            //抽選
            int pear = 2;
            java.util.List<String> shuffleList = shuffle1(list,pear);
            //表示
            dispResult(shuffleList);
          }
        }
       );

      clearButton.addMouseListener(
        new java.awt.event.MouseAdapter(){
          public void mouseClicked(java.awt.event.MouseEvent event){
            jl1.setText("");
          }
        }
       );	
   }

   static boolean isTextNg(){
     String strTextArea = jl1.getText().trim();
     return isNullOrEmpty(strTextArea);
   }

   static java.util.List getText(){
     String s = jl1.getText().trim();
     String ss[] = s.split(NEW_LINE);
     java.util.List<String> list = Arrays.asList(ss);
     return list;
   }
   
   static java.util.List shuffle1(java.util.List<String> list,int pear){
     java.util.List<String> nameList = new ArrayList();
     String buf = null;
     int i = 0;
     int amari = list.size() % pear;
    
     //組み合わせを抽選
     Collections.shuffle(list);
     //組み合わせ決定
     for(String s : list){
       if(isNullOrEmpty(s)) {
         continue;
       }
       if(i > 0) {
           if(list.size() <  (i + amari + pear)) {
             buf = s + DELIMITTER + buf;
           } else if(i % pear != 0){
             buf = s + DELIMITTER + buf;
             nameList.add(buf);
             buf = "";
           } else {
             buf = s;
           }
       } else {
         buf = s;
       }
       i++;
     }
     nameList.add(buf);
     
     //順番を抽選
     Collections.shuffle(nameList);
     return nameList;
    
  }
    
   static void dispResult(java.util.List<String> nameList){
     String input = jl1.getText().trim();
     jl1.setText("【抽選結果】" + NEW_LINE);
     int i = 1;
     for(String s : nameList){
       jl1.append(String.valueOf(i) + "組目" + NEW_LINE);
       jl1.append(s);
       jl1.append(NEW_LINE + NEW_LINE);
       i++;
     }
     jl1.append("仲良く仕事してね〜" + NEW_LINE);

     jl1.append("【入力値】" + NEW_LINE);
     jl1.append(input);
     
     return;
     
  }
  
   static boolean isNullOrEmpty(String str){
     boolean result = false;
     if (str == null || str.isEmpty()) {
       result = true;
     }
     return result;
   }
}
```

# googleスプレッドシートを元にgoogleカレンダーに登録
```calendarUtil.gs 
/*
* 実行した日付を元に行を検索し、カレンダを登録するスクリプト
*
*/
function createAllDayEventFromSheetByToday() {
  var targetDate;
  var today = new Date();
  var searchDate = Utilities.formatDate( today, 'JST', 'yyyy/MM/dd');
  var sheet = getSheetInstance('カレンダー');
  

  //行を特定しヒットした日付の担当者のカレンダーを登録
  for (var i = 1; i <= sheet.getLastRow(); i++){
    targetDate = Utilities.formatDate(sheet.getRange(i,1).getValue(),'JST', 'yyyy/MM/dd');
    if( targetDate == searchDate){
      createAllDayEvent(sheet, today ,i);
    }
  }
  return;
}

/*
* 指定した範囲のカレンダを登録するスクリプト
*
*/
function createAllDayEventFromSheetAll() {
  var sheet = getSheetInstance('カレンダー');
  var startRow = 180;
  var lastRow = sheet.getLastRow();
  for (var i = startRow; i <= lastRow; i++){
    createAllDayEvent(sheet, new Date(sheet.getRange(i,1).getValue()) ,i);
  }
  return;
}


/*
* カレンダを登録する
* @param sheet シートオブジェクト
* @param targetDate 対象日
* @param idx 対象行
*/
function createAllDayEvent(sheet, targetDate, idx) {
  var nameList = new Array();
  var mailList = new Array();
  var title = 'チーム運用当番 ';
  
  //名前を設定
  var userName = '';
  for (var i = 3; i <= 5; i++){
    userName= sheet.getRange(idx, i).getValue();
    if (userName) nameList.push(userName);
  }
 
  //メアドを設定
  var userMail = '';
  for (var i = 6; i <= 8; i++){
    userMail= sheet.getRange(idx, i).getValue();
    if (userMail) mailList.push(userMail);
  }
  
  if(mailList.length > 0){ 
    var cal =  getCalendarInstance('チーム運用当番');
    cal.createAllDayEvent(title+nameList.join(), targetDate, {description:"https://docs.google.com/spreadsheets/d/hogehoge",
                                              guests:mailList.join(),
                                              sendInvites:false});
  }
  return;
}

/*
* 指定した範囲のカレンダを削除するスクリプト
*
*/
function deleteAllDayEvent() {
  var sheet = getSheetInstance('カレンダー');  
  var cal =  getCalendarInstance('チーム運用当番');

  var startRow = 180;
  var lastRow = sheet.getLastRow();
  var events = cal.getEvents( new Date(sheet.getRange(startRow,1).getValue()),  new Date(sheet.getRange(lastRow,1).getValue()));
  
  for(var i=0; i<events.length; i++){
      events[i].deleteEvent();
  }
  return;
}

/*
* 指定したカレンダー名のオブジェクトを取得
* @param calendarName カレンダ名
* @return CalendarObject カレンダーオブジェクト
*/
function getCalendarInstance(calendarName) {
  var cal = CalendarApp.getCalendarsByName(calendarName);
  return cal[0];
}

/*
* 指定したシート名のオブジェクトを取得
* @param sheetName シート名
* @return SheetObject シートオブジェクト
*/
function getSheetInstance(sheetName) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  return sheet;
}
```