GASをうまく活用できると、繰り返しの作業を大幅に自動化することができます。うまく使っていきたいものです。以前友人に作成してもらったスクリプトを公開します。
function generateWeekSS() {
var planSS = SpreadsheetApp.getActiveSpreadsheet()
var planSheet = planSS.getActiveSheet()
var activeCell = planSheet.getCurrentCell()
var firstDateRow = activeCell.getRowIndex()
var firstDateStr = planSheet.getRange(firstDateRow, 1).getValue() + '/' + planSheet.getRange(firstDateRow, 2).getValue()
var confirmResult = Browser.msgBox('確認', firstDateStr + ' から始まる週予定を作成しますか?', Browser.Buttons.OK_CANCEL)
if (confirmResult !== 'ok') {
return
}
var folder = DriveApp.getFolderById('')
var templateId = ''
var newName = '週予定' + firstDateStr
var newFile = DriveApp.getFileById(templateId).makeCopy(newName, folder)
var newId = newFile.getId()
var newSS = SpreadsheetApp.openById(newId)
var editSheet = newSS.getSheetByName('編集用')
var basicSheet = planSS.getSheetByName('基本')
for (var i = 0; i < 5; i++) {
writeClassPlan(basicSheet, planSheet, firstDateRow, editSheet, i)
}
var listSheet = planSS.getSheetByName('週予定一覧')
listSheet.appendRow(['=HYPERLINK("' + newId + '/edit#gid=0","' + newName + '")', newId])
}
function writeClassPlan(basicSheet, planSheet, firstDateRow, editSheet, classIndex) {
var dateRow = 3 + 14 * classIndex
for (var i = 0; i < 5; i++) {
editSheet.getRange(dateRow, 3 + i).setValue(planSheet.getRange(firstDateRow + i, 4).getValue())
for (var j = 0; j < 4; j++) {
editSheet.getRange(dateRow + 7 + j, 3 + i).setValue(planSheet.getRange(firstDateRow + i, 6 + j).getValue())
}
}
var basicValues = basicSheet.getRange(4 + 9 * classIndex, 3, 6, 5).getValues()
editSheet.getRange(dateRow + 1, 3, 6, 5).setValues(basicValues)
}
こうやって見ると色々と複雑なことをやっています。ある場所から情報を取り出してそれを並べていくという作業の繰り返しです。また、コピーを作成したり、名前から情報を取り出したりしています。
最近運用方法を変えてみて、学年単位で運用できるように改善しました。もっと活用していきたいです。