見出し画像

【GAS】Google Apps Script 活用事例  シートの順序を乱数で、ぐちゃぐちゃに入れ替えるスクリプト

絶句.....どこに何のシートがあるか分からん......。

ファイルを開くと、手入れせず、放置されたシートが何十枚と存在する。
一元管理を目指して失敗した成れの果てみたいなファイル。

「どこに何のシートが保管されているのか、さっぱり分からない」

うんざりする.....そんな事ありませんか?シート枚数が多すぎて目的のシートを探すのにも一苦労。作成した本人しか知り得ない(退職しているケースもアリ)が、かつての勤め先にはたくさんありました。

これは、もう不要なシートだから削除しよう。そういうメンテナンスが時折必要だと思います。

管理職が管理できていなかったんですね、端的に言うと.....。
「いやぁー、スプレッドシートとか苦手でさー、そういうの得意でしょ?やておいてよ。」
ITは、自分より若い人に任せて、ずっと逃げてきた人でした。
......任せると逃げる両者は、全く違うぞ。

呪われたスプレッドシートとは?

何十枚も、シートが存在するファイルの場合、何らかの意図があって、このシートは1番目、あのシートは、3番目みたいな感じで、割とシート位置は固定されています。

今回ご紹介するスクリプトは、この一元化を目指したファイルの更新を諦めさせて、ファイルを作り直すきっかけを与えるために書きました。(使っていないですが、使ってみたくて。)

シート順序を入れ替えたら、手動で元に戻す。またスクリプトで強制的に入れ替える、いたちごっこみたいなですが、ちょっとした悪戯を楽しめそうな雰囲気はありました。

実務では使っていません(....本音は使いたい)

ちなみにスクリプトを実行すると、変更履歴に、残ってしまいます。防犯カメラにバッチリ写っている犯人みたくなってしまうので、やらないようにしましょう。

スクリーンショット 2020-05-22 15.02.43

スクリーンショット 2020-05-22 15.03.19

スクリプト自体はこんな感じ

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以上だったら、シートをぐちゃぐちゃに入れ替えます。スクリプトの実行者でさえ、どうなるか分かりません。

スクリーンショット 2020-05-22 14.48.05

スクリーンショット 2020-05-22 14.49.09

結構、変わってる。これを50枚とか、100枚あるシートで実行したいなぁ.....なんて思っています。10枚以上のシートは、極力、見たくないですね。

目次リストを作るスクリプト

画像3

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]),""))'
  ]
]);
}

目次を作るスクリプト、きちんと記事にしました。シート内容の説明が残るように工夫しています。

ちゃんと、役に立つスクリプトも書いています。


この記事が参加している募集

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