スプレッドシートのリストにある値の名前でシートを複製してリンクまで作成をする
やりたいことが、やや渋滞していますが、、、
- フォーマットとなるシートを準備して、リストにある名前をシート名にしてシートを複製する
- リストの横に作成したシートへのリンクを作成する
と、いうことをやりたいと思います。
前準備
- スプレッドシートの「list」シートに以下のような名簿を作成します。
- 複製をしたいフォーマットとなるシートは「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列に各シートへのリンクも一緒に作成することができます。