見出し画像

【GAS】Google Apps Script 活用事例 Zoomのブレイクアウトルーム用の班分けを乱数で生成するスクリプト

乱数を使って、名簿を並び替えって出来ないかな?

Zoomのブレイクアウトルームのグループ分けを簡単に作れないかなと思う機会があり、スクリプトを書いてみました。他の方の参考になれば幸いです。コロナ禍でのコミュニケーションならではの需要かなと思います。

スクリーンショット 2021-10-02 14.35.15

※ 上記の名前は、なーんちゃって個人情報というジェネレータで作成しております。

ブレイクアウトルームとは、開催しているZoomミーティングにおいて、参加者を少人数のグループに分けてミーティングを行える機能です。

スクリプトはこんな感じ


function generateNameValues() {
 const sheet  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('名簿');
 const array = sheet.getRange('B1:E5').getValues().flat();

 //indexは0から始まるので、わかりやすいように1を足す
 //ランダムに並び替えるために、indexに変換する
 const convertedArray = array.map((value, index) => index+=1);
 const max            = convertedArray.length;
 const randoms        = generateRandomNumber_(max);
 const newNameArray   = array.map((value, index) => array[randoms[index]]);

 console.log(`オリジナルの配列\n${array}`);
 console.log(`indexに変換後\n${convertedArray}`);
 console.log(`配列の最大値 ${max}`);
 console.log(`ランダムに生成された配列\n${randoms}`);
 console.log(`名前を入れ替えた後の配列\n${newNameArray}`);

 //2次元配列に変換、貼り付けする
 const values = convertArrayToValues_(newNameArray);
 sheet.getRange(8, 2, values.length, values[0].length).setValues(values);
 
}



//重複のないランダムな配列を生成する
function generateRandomNumber_(max){
 const randoms = [];
 for(let i = 1; i <= max; i++){
   while(true){
     const temp = Math.floor(Math.random() * max);
     //console.log(`生成された乱数 ${temp}`);
     if(!randoms.includes(temp)){
       //配列 randomsに生成された数字が含まれていなければ追加
       randoms.push(temp);
       break;
     }//if
   }//while
 }//for
 return randoms
}




//1次元配列を、4列の2次元配列に変換する
function convertArrayToValues_(array){
 let values = [];
 let temp   = [];

 for(let i = 0; i < array.length; i++){
   let count = i + 1;
   temp.push(array[i]);
   //console.log(temp);

   //4で割り切れたらvaluesに追加して、tempを初期化
   if(count % 4 === 0){
     values.push(temp);
     temp = [];
   }//if
 }//for
 console.log(values);
 return values
}
スクリーンショット 2021-10-02 15.13.01

おまけ シート上の表から名字のみを取得する

「こういう班分けになりましたー!」とSlackで報告することがありました。上司から、出来たら名字のみで表示してほしい。そして名字と名字の間は、句読点で区切って欲しいとフィードバックを受け、こちらもスクリプトを書いてみました。

A 山崎 あき 岡村 徹平 佐竹 桃子 市川 なぎさ
B 矢野 はるみ 西脇 ヒカル 西村 禄郎 神山 あい
C 臼井 知世 横川 恵望子 西山 愛菜 池田 哲平
D 藤原 遥 小谷 しぼり 松田 光博 岡島 克実
E 磯部 寛治 志賀 真悠子 竹中 杏 市田 なつみ

名字のみで表示、こういう形です。

A 山崎、岡村、佐竹、市川
B 矢野、西脇、西村、神山
C 臼井、横川、西山、池田
D 藤原、小谷、松田、岡島
E 磯部、志賀、竹中、市田

function convertToString() {
 const sheet  = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('名簿');
 const values = sheet.getRange('A1:E5').getValues();
	
 //元データ
 console.log(values);
 
 let string  = '';
 const array = values.map(array => array.map(value => value.replace(/ .*/,'')).join('、'));
 array.map(value => string += value.replace('、','  ').replace(/、$/,'') + '\n');
 
 //文字列に変換
 console.log(string);
}
スクリーンショット 2021-10-02 11.03.13

Zoomに関連した記事

自分用メモ 配列内の要素を小さい順に並び替える

 //配列の数値を小さい順に並び替える
 //convertedArray.sort((first, second) => first - second);

乱数を使った他の記事


この記事が気に入ったらサポートをしてみませんか?