【GAS】Google Apps Script 活用事例 シートの順序を乱数で、ぐちゃぐちゃに入れ替えるスクリプト
絶句.....どこに何のシートがあるか分からん......。
ファイルを開くと、手入れせず、放置されたシートが何十枚と存在する。
一元管理を目指して失敗した成れの果てみたいなファイル。
「どこに何のシートが保管されているのか、さっぱり分からない」
うんざりする.....そんな事ありませんか?シート枚数が多すぎて目的のシートを探すのにも一苦労。作成した本人しか知り得ない(退職しているケースもアリ)が、かつての勤め先にはたくさんありました。
これは、もう不要なシートだから削除しよう。そういうメンテナンスが時折必要だと思います。
管理職が管理できていなかったんですね、端的に言うと.....。
「いやぁー、スプレッドシートとか苦手でさー、そういうの得意でしょ?やておいてよ。」
ITは、自分より若い人に任せて、ずっと逃げてきた人でした。
......任せると逃げる両者は、全く違うぞ。
呪われたスプレッドシートとは?
何十枚も、シートが存在するファイルの場合、何らかの意図があって、このシートは1番目、あのシートは、3番目みたいな感じで、割とシート位置は固定されています。
今回ご紹介するスクリプトは、この一元化を目指したファイルの更新を諦めさせて、ファイルを作り直すきっかけを与えるために書きました。(使っていないですが、使ってみたくて。)
シート順序を入れ替えたら、手動で元に戻す。またスクリプトで強制的に入れ替える、いたちごっこみたいなですが、ちょっとした悪戯を楽しめそうな雰囲気はありました。
実務では使っていません(....本音は使いたい)
ちなみにスクリプトを実行すると、変更履歴に、残ってしまいます。防犯カメラにバッチリ写っている犯人みたくなってしまうので、やらないようにしましょう。
スクリプト自体はこんな感じ
function shuffleSheetPosition() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheets = spreadsheet.getSheets();
const numberArray = generateRandomNumber_(sheets.length);
for(let i = 0; i < sheets.length; i++){
//0が含まれているので、0以外だったら、シートを動かす
if(numberArray[i] > 0){
spreadsheet.setActiveSheet(sheets[i], true);
spreadsheet.moveActiveSheet(numberArray[i]);
}
}//for_i
}
//重複のないランダムな配列を生成する
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
console.log(randoms);
return randoms
}
2021/10/31 スクリプトをリライトしました。
配列に入れる数の重複がないように変更しました。
getActiveSheetや、getSheetByName()以外にもgetSheets()というファイルに存在するシート全てを配列で取得するメソッドがあります。
const sheets = spreadsheet.getSheets();
//sheets[0]が、1番目のシート
シートを選んで、移動させる際にランダムな数字を代入する
spreadsheet.setActiveSheet(sheets[i], true);
spreadsheet.moveActiveSheet(random);
moveActiveSheetの引数に、0を入れる事が出来ないため、if文でrandomが0以上だったら、シートをぐちゃぐちゃに入れ替えます。スクリプトの実行者でさえ、どうなるか分かりません。
結構、変わってる。これを50枚とか、100枚あるシートで実行したいなぁ.....なんて思っています。10枚以上のシートは、極力、見たくないですね。
目次リストを作るスクリプト
function generatePageList(){
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const ssUrl = spreadsheet.getUrl();
const shs = spreadsheet.getSheets();
const array = [['シート名', 'URL','同一タブで開く','QR']];
for(let i = 1; i < shs.length; i++) { // index シートを除くため i は 1 から開始
const sh = shs[i];
const shName = sh.getName()
const shUrl = ssUrl + '#gid=' + sh.getSheetId();
array.push([shName, shUrl, '', '']);
}
const indexSh = spreadsheet.getSheetByName('index');
/*シートをアクティブにして、左から1番目に移動する*/
spreadsheet.setActiveSheet(indexSh, true);
spreadsheet.moveActiveSheet(1);
const indexRange = indexSh.getDataRange();
indexRange.clearContent();
indexSh.getRange(1, 1, array.length, array[0].length).setValues(array);
indexSh.getRange('C2:D2').setFormulasR1C1([
['=ARRAYFORMULA(IFERROR(HYPERLINK(REGEXEXTRACT(R[0]C[-1]:C[-1],"#.*"),R[0]C[-2]:C[-2]),""))',
'=ARRAYFORMULA(IF(R[0]C[-2]:C[-2]<>"",IMAGE("https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl="&R[0]C[-2]:C[-2]),""))'
]
]);
}
目次を作るスクリプト、きちんと記事にしました。シート内容の説明が残るように工夫しています。
ちゃんと、役に立つスクリプトも書いています。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?