スポンサーリンク

スプレッドシートのリストにある値の名前でシートを複製してリンクまで作成をする

やりたいことが、やや渋滞していますが、、、

  • フォーマットとなるシートを準備して、リストにある名前をシート名にしてシートを複製する
  • リストの横に作成したシートへのリンクを作成する

と、いうことをやりたいと思います。

前準備

  1. スプレッドシートの「list」シートに以下のような名簿を作成します。
  1. 複製をしたいフォーマットとなるシートは「format」シートという名前で同じスプレッドシートに準備をします。
スポンサーリンク

コード

/**
 * 設定したリストの名前でフォーマットシートを複製してシートを作成する。
 */
function create_sheet() {
  // アクティブシートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  // シートのコピーを作るリストのあるシートを取得
  const listSheet = spreadsheet.getSheetByName('list');

  // コピー元のシートを取得
  const formatSheet = spreadsheet.getSheetByName('format');

  // スプレッドシートのURLを取得
  const spreadsheetUrl = spreadsheet.getUrl();

  for (let i = 0; i < listSheet.getLastRow() - 1; i++) {
    // A列に設定しているシート名を取得
    let name = listSheet.getRange(i + 2, 1).getValue();

    // 同名のシートがある場合はシートの複製を行わない。
    if (is_same_sheet_name_(spreadsheet.getSheets(), name)) {
      Logger.log("not create sheet " + name);
      continue;
    }
    
    // コピー元のシートを複製
    let newSheet = formatSheet.copyTo(spreadsheet);

    // シート名を設定
    newSheet.setName(name);

    // シート名の隣の列(B列)にリンクを作成
    listSheet.getRange(i + 2, 2).setValue('=HYPERLINK("' + spreadsheetUrl + '#gid=' + newSheet.getSheetId() + '", "リンク")');

    Logger.log('create sheet ' + newSheet.getName());
  }
}

/**
 * 同名のシートがあるかを返却します。
 * @param {Sheet[]} シート名の配列
 * @param {String} シート名
 * @return {boolean} true:同名のシートあり、false:同名のシートなし
 */
function is_same_sheet_name_(sheets, name) {
  for (let i = 0; i < sheets.length; i++) {
      if (sheets[i].getName() == name) {
        return true;
      }
  }
  return false;
}

実行結果

以下のように、氏名のシートが作成され、リストのB列に各シートへのリンクも一緒に作成することができます。

スポンサーリンク
レンタルサーバー
おすすめの記事