Skip to content
sumnail

GASで複数のシートを一括生成する方法

created at : 2024/06/26

GAS

なぜ必要になったか?

スプレッドシートでシートを生成する場合、シートを新しく作成してシート名を設定すると約 1 分かかります。

例えば、ユーザーリストをもとにユーザーごとのシートを作成したい場合に、シートを一つずつ手動で作成するのは非効率です。 ユーザー数が多くなるほど、手動での作業は困難になります。(1 人あたり約 1 分とすると、60 名分を作るのに 1 時間です!!)

一括生成する方法

以下のスクリプトを使用することで、ユーザーリストusersをもとにシートを一括生成することができます。

ts
function createSheets() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const users = ["user1", "user2", "user3"]; // ※ここにシート名のリストを用意する
  users.forEach((user) => {
    ss.insertSheet(user);
  });
}

上記のスクリプトを実行すると、user1user2user3のシートが一括生成されます。

シートからリストを取得して一括生成する方法

シートからユーザーリストを取得してシートを一括生成する方法も紹介します。

ts
function createSheetsFromSheet() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("users"); // ※ここにユーザーリストのシート名を指定する
  const users = sheet
    .getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn())
    .getValues()
    .flat(); // ※ここにユーザーリストの範囲を指定する
  users.forEach((user) => {
    ss.insertSheet(user);
  });
}

上記のスクリプトを実行すると、usersシートから取得したユーザーリストをもとにシートが一括生成されます。

生成したシートのリンクを取得する方法

シートを一括生成した後、生成したシートのリンクを一覧にする方法を紹介します。

ts
function getSheetLinks() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheets = ss.getSheets();
  const sheetLinks = sheets.map((sheet) => {
    return (
      "https://docs.google.com/spreadsheets/d/" +
      ss.getId() +
      "/edit#gid=" +
      sheet.getSheetId()
    );
  });
  Logger.log(sheetLinks);
}

上記のスクリプトを実行すると、生成したシートのリンクがログに出力されます。

ユーザーリストにシートのリンクを追加する方法

ユーザーリストに生成したシートのリンクを追加する方法を紹介します。

ts
function getSheetLink(sheet) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ssId = ss.getId();
  const sheetId = sheet.getSheetId();
  return (
    "https://docs.google.com/spreadsheets/d/" + ssId + "/edit#gid=" + sheetId
  );
}

function addSheetLinksToUsers() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("users"); // ※ここにリストのシート名を指定する
  const users = sheet
    .getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn())
    .getValues()
    .flat(); // ※ここにリストの範囲を指定する
  users.forEach((user, index) => {
    const newSheet = ss.insertSheet(user);
    sheet.getRange(index + 1, 2).setValue(getSheetLink(newSheet)); // indexは0から始まるため、+1する
    SpreadsheetApp.flush();
  });
}

上記のスクリプトを実行すると、usersシートに生成したシートのリンクが追加されます。

getRange()の第二引数にリンクを追加したい列を指定してください。
第一引数、第二引数共に対応するセルは 1 から始まることに注意してください。

setValue()の後にSpreadsheetApp.flush()を実行することで、生成したシートのリンクを即時反映させることができます。