Back to blog
Jan 20, 2023
2 min read

【GAS】スプレッドシートの全てのセルに枠線を付ける【コピペOK】

はじめに

こんにちは、こふです。

Google スプレッドシートではエクセルと異なり、全てのセルに対して自動的に枠線つけることができないです。あくまで本記事の更新日時点ですので、仕様が変わることや機能が追加されることは想定されます。

手段がない中どうやろうか考えた結果、GAS(Google Apps Script)を使って実行することにしました。

手順

無駄な説明抜きに手順を説明します。

  1. スプレッドシートのシートの ID を取得する
  2. GAS を作成・ログインする
  3. コピペして動作させる
  4. 定期実行させる

手順 1:スプレッドシートのシートの ID を取得する

スプレッドシートが用意できていない方はGoogle スプレッドシートにアクセスし、右下のプラスボタンからシートを作成します。

作成すると以下のようになります。

そのページの URL を確認します。

今作成したシートはhttps://docs.google.com/spreadsheets/d/1IH2NkWgv53azxES74q3BQcQe_SUt7OFKLRyiHAXDe6o/edit#gid=0のようになっています。

https://docs.google.com/spreadsheets/d/ID/edit#gid=0IDとした部分が ID です。これをコピーしておきます。仮に世界に公開したとしても、これだけでは何も攻撃できないので問題ありません。

手順 2:GAS を作成・ログインする

Apps Script – Google Apps ScriptへアクセスしStart Scriptingを押します。

ログインが必要であればログインし、次のような画面になれば問題ありません。

左上の新しいプロジェクトをクリックします。

プログラムを入力できる画面になれば OK です。

手順 3:コピペして動作させる

以下のコードをコピーして貼り付けます。

MASTER_SHEET_ID = "先程コピーしたID";
function setBorders() {
  var sheets = SpreadsheetApp.openById(MASTER_SHEET_ID).getSheets();
  for (const sheet of sheets) {
    // 以下はZ列まで全て行う場合です
    // 値がある範囲だけ行いたい場合は.getRange('Z:Z')を削除してください
    const col_num = sheet.getRange("Z:Z").getLastColumn();
    const row_num = sheet.getRange("Z:Z").getLastRow();
    for (i = 1; i <= row_num; i++) {
      for (j = 1; j <= col_num; j++) {
        sheet
          .getRange(i, j, 1, 1)
          .setBorder(true, true, true, true, false, false);
      }
    }
  }
}

実行の左にある保存ボタンを押して保存すると実行できるようになります。

そして実行を押すと以下のようになります。

GAS にスプレッドシートをアクセスする権限を与える必要があります。アカウントを選択すると次のようになります。

ここで「詳細」をクリックして「無題のプロジェクト(安全ではないページ)に移動」を押します。

これを許可してあげます。

すると実行ログが出てきます。

そしてシートを見ると、確かに枠線が付いていますね。

手順 4:定期実行させる

トリガーという目覚まし時計のアイコンをクリックします。

トリガーを追加、を押して次の画面のように設定します。

これで保存すれば動きます。

コード解説

コメントを適宜書きましたのでご確認ください。

MASTER_SHEET_ID = "先程コピーしたID";
function setBorders() {
  // 特定のスプレッドシートの全てのシートを取得する
  var sheets = SpreadsheetApp.openById(MASTER_SHEET_ID).getSheets();
  for (const sheet of sheets) {
    // 以下はZ列まで全て行う場合です
    // 値がある範囲だけ行いたい場合は.getRange('Z:Z')を削除してください
    const col_num = sheet.getRange("Z:Z").getLastColumn();
    const row_num = sheet.getRange("Z:Z").getLastRow();
    // それぞれのセルに対して枠線を書きます(これ以外の手法が思いつかず・・・)
    for (i = 1; i <= row_num; i++) {
      for (j = 1; j <= col_num; j++) {
        sheet
          .getRange(i, j, 1, 1)
          .setBorder(true, true, true, true, false, false);
      }
    }
  }
}

想定されるケース

僕の利用しているスプレッドシートで困ったわけではないのですが、全てのセルの枠線を付けたシートがあるとします。

これに何か値をコピーしたり、新たに行を追加するシーンを想定してください。

これらの操作を行うと、枠線が消えます。めんどくさいです。

これを週一回程度、全て枠線がつくようにすれば楽だと思い、実行しました。

エクセルでは条件付き書式で枠線をかけるようですが、スプレッドシートでは不可能なので GAS を用いた次第です。

おわりに

これで手作業がなくなり便利になりました。最後までお読みいただきありがとうございました。