ブログ

Googleスプレッドシートに「特定の範囲を一括消去」マクロを実装する

PSO2界隈で固定PTを組むときにGoogleスプレッドシートを使ってる人をよく見かけるが、シートは使い回しなのでいちいち消去するのが煩わしい。

というわけで、ExcelマクロよろしくGoogleスプレッドシートでも導入できるマクロ(ここではスクリプトと表記する)を紹介させて頂く。

1. スクリプトを実行するためのコマンドボタンの設置

Googleスプレッドシートのメニューバーから「挿入」→「図形の描画」を選択。

すると、キャンパスが表示されるので自分の好きなボタンをデザインし「保存して閉じる」を押す。

作った図形がスプレッドシートに設置されるので、好きな場所に置こう。

これで下準備の完了。

2. スクリプトの設置

続いてスクリプトを記述していく。

メニューバーから「ツール」→「スクリプトエディタ」を選択。
新しくページが開かれると、下のようなテキストが書かれた画面が出る。

function myFunction() {
  
}

このテキストを下のように書き換える。

function initialize_sheet1() { // sheet1消去範囲設定(必要に応じて増やす)
  // 消去範囲の配列を宣言
  var range= new Array();
 
  // 消去範囲の定義(シート内の一括消去したい範囲をここで指定)
  range[0] = 'A1:B1';
  range[1] = 'B2:C2';
  
  // 処理用関数呼び出し
  set_value(range);
} // sheet1消去範囲設定ここまで


function set_value(range){ // 処理用関数。ボタンに割り当てのないこと!
  // 現在アクティブのスプレッドシートオブジェクトを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  // 取得したスプレッドシートオブジェクトから現在アクティブのシートのオブジェクトを取得
  var sheet = ss.getActiveSheet();
  
  // 受け取った配列の要素数繰り返す
  for(var i = 0 ; i < range.length ; i++){
    // 範囲オブジェクト設定
    var set_range = sheet.getRange(range[i]);
 
    // 範囲内の全てのセルの値を空白にする
    set_range.setValue('');
  }
}

このスクリプトは「”sheet1″のA1:B1の範囲とB2:C2の範囲内のセルの値を空白にする」スクリプトになっている。
もし、消去したいセルを増やしたければ、6行目の所を

range[0] = 'A1:B1';
range[1] = 'B2:C2';
range[2] = 'D2:F2';

のように追記すれば動く。

他にも、複数のシートにも使いたいときは1行目から11行目をコピーして、一行目の「initialize_sheet1」の部分を重複しないように書き換えればいい。

最後に、ツールバーから保存ボタンを選択して適当なプロジェクト名で保存すればスクリプトの実装完了!

3. 「1」で作ったボタンにスクリプトを割り当てる

1で作成した図形を右クリックすると、右上に「▼」のボタンがあるので、そこから「スクリプトの割り当て」を選択する。

入力欄が出るのでそこに2のスクリプトの1行目の「initialize_sheet1」を入力してOKを押す。(あくまでも一例なので臨機応変で)

これで図形が実行ボタンとして機能するようになるので、クリックするとスクリプトが実行されるようになる。

初回起動時は認証か何か必要になるので適当にやり過ごしておく。

また、このスクリプトはシートの編集できる人のみ実行可能なのでシートの保護をしてる方はご安心を。

以上、これでおわり!

-補足-

コメントページにてSHEET1に設置したボタンでSHEET2~100のセルを削除したいとご要望があったのでそのコードを記載します。

14行目の「function set_value(range)」以降を次のように置き換えてみて下さい。

function set_value(range){ // 処理用関数。ボタンに割り当てのないこと!

  // 現在アクティブのスプレッドシートオブジェクトを取得
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  for(var i1 = 2 ; i1 <= 100 ; i1++){ //SHEET2~SHEET100を繰り返す

    // 取得したスプレッドシートオブジェクトから指定のシートのオブジェクトを取得
    var sheet = ss.getSheetByName('SHEET' + i1);

    // 受け取った配列の要素数繰り返す
    for(var i2 = 0 ; i2 < range.length ; i2++){

      // 範囲オブジェクト設定
      var set_range = sheet.getRange(range[i2]);

      // 範囲内の全てのセルの値を空白にする
      set_range.setValue('');
    }
  }
}

関連記事

コメント

    • nao
    • 2017年 2月 14日

    有益な情報ありがとうございます。
    初心者でもわからないなりに試すことができそうで大変助かります。

    実行してみたところ「ステートメントの前に ; がありません。(行 19、ファイル「コード」)」と表示されたのですが、
    なにか書き換えないといけないでしょうか?

      • shimosyan
      • 2017年 2月 15日

      コメントありがとうございます!

      ご指摘の件調べてみたところ、公開後に実装されたシステム側の自動校正機能により記述内容が若干書き換わってしまっていたようです。

      現在は修正させて頂きましたので、再度お試しいただけたらと思います!

    • k
    • 2017年 11月 16日

    こんにちわ、同じようなところで困っていて検索でたどり着きました。
    自分は「sheet1に設置したボタンを押すとSHEET2~SHEET100の一括消去を行う」という処理がしたくて困っているのですが、ここでシェアされているコードで実行可能なものでしょうか?
    頂いた情報を踏まえて改変を加え設定しましたが、「ボタンが設置されているシートの一括消去を行う」という挙動しか確認できませんでした。
    もともと「SHEET2~SHEET100にそれぞれボタンを設置する」前提で書かれたコードなのかどうか気になりコメントさせて頂きました。
    回答よろしくお願いします。

      • shimosyan
      • 2017年 11月 18日

      本記事で紹介しているコードは「ボタンが設置されているシートの一括消去を行う」を前提に作成したコードですので、残念ながらご質問頂いた機能を実現させることは出来ません。

      もし「削除する箇所がSHEET2~SHEET100全て同じである」ことを前提であれば…というコードを本記事の補足にて紹介いたしますので、よろしければお試しください。

  1. この記事へのトラックバックはありません。

ページ上部へ戻る