Created
June 3, 2022 23:02
-
-
Save Tomokatsu-Sakamoto/df7d6bc0b7a96b75e6f72713d4a551d4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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