< Back

ランチメンバーをランダムでいい感じに選ぶGASスクリプト

スクリーンショット 2020-12-28 2.10.22.png

以下のようなURLをクリックするだけで、規定の配列から何人か選んでくれる。

https://script.google.com/macros/s/XXXXX-XXXX/exec
https://script.google.com/macros/s/XXXXX-XXXX/exec?num=2
https://script.google.com/macros/s/XXXXX-XXXX/exec?num=3
https://script.google.com/macros/s/XXXXX-XXXX/exec?num=4

以下のようなスクリプトをGASにいれて、Webアプリケーションとして公開したらOK

function doGet(e) {
  if(!isOurGsuiteUser()) {
    return resText("ログインアドレスが違います");
  }

  postSlackMessage(getMessageArray(e).join("\n"));

  return resText("OK!");
}

function testSlack() {
  const array = getMessageArray();

  postSlackMessage(array.join("\n"))
}

function getMessageArray(e) {
  const num = getNum(e);
  const array = [
    getLoginUser() + `さんからのリクエストでランダムに \`${num}\` 選ばれました :tada:`,
    "",
    "```",
    ...(getMember(num)),
    "```",
    "",
    "ランチとか1on1とか楽しんできてください:+1::star:",
  ];

  return array;
}

function postSlackMessage(message) {
  var postUrl = 'https://hooks.slack.com/services/BBBBB/XXXX/????????'; // webhookurlは自分のチャンネルで取得してください
  var username = 'Choice BOT';
  var icon = ':slightly_smiling_face:';

  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

/**
 * memberを指定の数だけ返す
 */
function getMember(num){
  const member = [
    'Aさん',
    'Bさん',
    'Cさん'
  ];

  return shuffle(member).slice(0,num);
}

/**
 * 何人にするか
 * 基本は1人
 * @return number
 */
function getNum(e) {
  if (!e) {
    return 1;
  }

  const num = parseInt(e.parameter.num);

  return isNaN(num) ? 1 : num; 
}

/**
 * ログインユーザーのアドレスを確認して弊社社員か確認する
 */
function isOurGsuiteUser() {
  const user = Session.getActiveUser();
  const email = user.getEmail();

  return email && email.split("@") && email.split("@")[1] === "gmail.com";
}

/**
 * ログインユーザーを取得
 * return Sting
 */
function getLoginUser() {
  const user = Session.getActiveUser();
  const email = user.getEmail();

  if (email && email.split("@") && email.split("@")[0]) {
    return email.split("@")[0];
  }

  return "Who??";
}


/**
 * responceのラッパーにしようとしている
 */
function resText(text) {
  return ContentService.createTextOutput(text)
}


/**
 * 配列をシャッフルする
 */
function shuffle(array) {
  for (let i = array.length - 1; i >= 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }

  return array;
}