Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Tomokatsu-Sakamoto/df7d6bc0b7a96b75e6f72713d4a551d4 to your computer and use it in GitHub Desktop.
Save Tomokatsu-Sakamoto/df7d6bc0b7a96b75e6f72713d4a551d4 to your computer and use it in GitHub Desktop.
'use strict'
const nameTemplate = "テンプレート";
/*****************************************************************************
* テンプレートとなるシートからコピーしたスプレッドシートを作成する
*/
function makeWorksheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet(); // アクティブなスプレッドシートを取得
const fileName = ss.getName(); // ファイル名を取得する
const fileId = ss.getId(); // スプレッドシートのファイル ID を取得
const sheet = SpreadsheetApp.getActiveSheet(); // アクティブなシートを取得
let values = sheet.getDataRange().getValues(); // 配列へシート全体を読み込む
let targetName = values[0][4]; // 作成するスプレッドシート名を取得
if ((targetName == "") || (targetName == null)) {
const today = new Date();
targetName = "ワークシート " + Utilities.formatDate(today, "JST", "yyyyMMdd-HHmmss");
}
Logger.log(targetName);
// スプレッドシートのファイル ID から保存されているフォルダの ID を取得
let parentFolder = DriveApp.getFileById(fileId).getParents();
let folderId = parentFolder.next().getId();
// 新しいスプレッドシートを作成する
const sheetNew = SpreadsheetApp.create(targetName);
let ssId = sheetNew.getId(); // スプレッドシート ID
const newFile = DriveApp.getFileById(ssId); // 移動をさせるためのFileオブジェクト
const targetFolder = DriveApp.getFolderById(folderId); // 新しいスプレッドシートを作成するフォルダ
targetFolder.addFile(newFile); // 作成したスプレッドシートを指定したフォルダへ追加
DriveApp.removeFile(newFile); // 最初に作成したスプレッドシートを削除
const sheetTemplate = ss.getSheetByName(nameTemplate); // アクティブなスプレッドシートを取得
sheetTemplate.copyTo(sheetNew); // テンプレートのシートをコピーする
// 新規作成されたシートに存在している空のシートを削除
let sheetList = sheetNew.getSheets(); // 新しいスプレッド―シート内のシートを取得
let sheetWork;
for (let i = 0; i < sheetList.length; i++) {
if (sheetList[i].getName() == "シート1") {
sheetNew.deleteSheet(sheetList[i]); // 空のシートを削除する
}
else { // それ以外は、テンプレートがコピーされたワークシート
sheetWork = sheetList[i].setName(nameTemplate); // テンプレートのシート名は元に戻す
}
}
// 対象となる編集可能なメンバーの一覧を取得
let nameList = sheet.getRange(2, 2, 40, 1).getValues().flat(); // 配列へシート全体を読み込む
for (let i = nameList.length - 1; i >= 0; i--) {
if (nameList[i] === "") {
nameList.splice(i, 1); // 1つ削除
}
}
sheetNew.addEditors(nameList); // 編集権限を付加
var protection = sheetWork.protect();
// protection.removeEditors(nameList); // 対象シート全体から編集権限をはずす
// それぞれのセルに保護を設定する
for (let i = 0; i < 40; i++) { // 40人分くり返す
SpreadsheetApp.getActive().toast("進捗状況:" + (i / 40 * 100) + "%");
let rr = 2 + Math.floor(i / 10) * 2; // B2~K2、B4~K4、B6~K7、B8~K8
let cc = (i % 10) + 2; //
let student = values[i + 1][1];
sheetWork.getRange(rr, cc)
.setHorizontalAlignment('center') // 中央
.setVerticalAlignment('middle'); // 中央
if (student != "") {
Logger.log(i + " : " + student);
protection = sheetWork.getRange(rr, cc).protect();
protection.setDescription(student); // 説明はメールアドレス
protection.removeEditors(nameList); // 一旦、全部のユーザーを削除
protection.addEditors([student]); // 担当者だけを追加する
}
else {
sheetWork.getRange(rr, cc).setValue("---");
}
}
protection = sheetWork.getRange("1:1").protect();
protection.removeEditors(nameList); // 見出し行は変更できないように
protection = sheetWork.getRange("3:3").protect();
protection.removeEditors(nameList); // 見出し行は変更できないように
protection = sheetWork.getRange("5:5").protect();
protection.removeEditors(nameList); // 見出し行は変更できないように
protection = sheetWork.getRange("7:7").protect();
protection.removeEditors(nameList); // 見出し行は変更できないように
SpreadsheetApp.getActive().toast("「" + targetName + "」の作成が終了しました。");
}
/*****************************************************************************
* メールアドレスの一覧をクリアする
*/
function listClear() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('B2:B41').clear(
{
contentsOnly: true, skipFilteredRows: true
}
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment