Created
September 30, 2024 02:02
-
-
Save kninami/39597f415bd6c50cf679dcb8edf9abce to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| const currentSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
| const currentSheet = currentSpreadsheet.getActiveSheet(); | |
| const file = DriveApp.getFileById(currentSpreadsheet.getId()); | |
| function onOpen() { | |
| var ui = SpreadsheetApp.getUi(); | |
| ui.createMenu('Sluggish Hackers') | |
| .addItem('개인정보 자동삭제 설정', 'showForm') | |
| .addToUi(); | |
| } | |
| function showForm() { | |
| var html = HtmlService.createHtmlOutputFromFile('deleteForm') | |
| .setWidth(300) | |
| .setHeight(200); | |
| SpreadsheetApp.getUi().showModalDialog(html, '개인정보 자동삭제 설정'); | |
| } | |
| function deleteProcessInSheets(columnNameList){ | |
| var values = currentSheet.getDataRange().getValues(); | |
| var currentTitle = file.getName(); | |
| var newTitle = currentTitle + " Safe Version"; | |
| var newSpreadsheet = SpreadsheetApp.create(newTitle); | |
| var newSpreadsheetUrl = newSpreadsheet.getUrl(); | |
| var safeSheet = newSpreadsheet.getSheets()[0]; | |
| try{ | |
| columnNameList.forEach(function(columnName) { | |
| var columnIndex = getColumnIndex(currentSheet, columnName); | |
| if (columnIndex !== -1) { | |
| for (var i = 1; i < values.length; i++) { | |
| currentSheet.getRange(i + 1, columnIndex + 1).setValue(''); | |
| } | |
| } else { | |
| SpreadsheetApp.getUi().alert("Column " + columnName + " not found."); | |
| } | |
| }); | |
| // 개인정보 데이터가 없는 상태에서 시트 데이터 복사 | |
| var range = currentSheet.getDataRange(); | |
| safeSheet.getRange(1, 1, range.getNumRows(), range.getNumColumns()).setValues(range.getValues()); | |
| }catch(e){ | |
| Logger.log("error occurred:::") | |
| Logger.log(e) | |
| }finally{ | |
| // 파일 제목 변경 | |
| file.setName("[삭제요망] "+currentTitle); | |
| return newSpreadsheetUrl; | |
| } | |
| } | |
| function sendEmailToManager(newSpreadsheetUrl){ | |
| managerMail = "" | |
| var owner = file.getOwner(); // 파일 소유자 정보 가져오기 | |
| var ownerEmail = owner.getEmail(); // 소유자의 이메일 주소 가져오기 | |
| MailApp.sendEmail({ | |
| to: ownerEmail, | |
| subject: "[개인정보 삭제 처리 완료]" + file.getName(), | |
| htmlBody: "안녕하세요. 설정하신 개인정보 컬럼 삭제가 완료되었습니다. <br/><br/> " + | |
| "아래 주소에서 개인정보 컬럼이 삭제된 파일을 확인하실 수 있습니다. <br/>" + | |
| "- 개인정보가 삭제된 파일 Url: " + newSpreadsheetUrl + "<br/>" + | |
| "- 원본 파일 Url: " + currentSpreadsheet.getUrl() + "<br/><br/>" + | |
| "원본 파일은 확인하신 후 파일 삭제하시기를 권장드립니다." | |
| }); | |
| } | |
| /** | |
| * 1. 개인정보가 있는 컬럼의 데이터를 삭제 | |
| * 2. 신규 시트 생성 | |
| * 3. 개인정보가 삭제된 데이터를 전체 복사하여 신규 시트에 복사 | |
| */ | |
| function processFormData(columnNames, deleteDate) { | |
| var columnNameList = columnNames.split(',').map(function(name) { | |
| return name.trim(); | |
| }); | |
| deleteDate = new Date(deleteDate); | |
| var today = new Date(); | |
| // 개인정보 삭제 | |
| if (deleteDate <= today) { | |
| newSpreadsheetUrl = deleteProcessInSheets(columnNameList); | |
| sendEmailToManager(newSpreadsheetUrl); | |
| SpreadsheetApp.getUi().alert("개인정보 삭제가 완료되었습니다"); | |
| } else { | |
| setDeleteTrigger(columnNames, deleteDate); | |
| SpreadsheetApp.getUi().alert("개인정보 삭제 설정이 완료되었습니다"); | |
| } | |
| } | |
| function getColumnIndex(sheet, columnName) { | |
| var headers = sheet.getDataRange().getValues()[0]; | |
| for (var i = 0; i < headers.length; i++) { | |
| if (headers[i] === columnName) { | |
| return i; | |
| } | |
| } | |
| return -1; | |
| } | |
| function setDeleteTrigger(columnNames, deleteDate) { | |
| // 기존 트리거 삭제 | |
| deleteTriggers(); | |
| // 삭제할 날짜를 기준으로 트리거 설정 | |
| var triggerDate = new Date(deleteDate); | |
| triggerDate.setHours(0, 0, 0, 0); // 자정에 실행되도록 설정 | |
| // 트리거를 설정하여 지정된 날짜에 삭제 함수 실행 | |
| ScriptApp.newTrigger('processFormDataWithTrigger') | |
| .timeBased() | |
| .at(triggerDate) | |
| .create(); | |
| // 입력한 컬럼 이름과 삭제할 날짜를 저장 | |
| PropertiesService.getScriptProperties().setProperty('columnNames', columnNames); | |
| PropertiesService.getScriptProperties().setProperty('deleteDate', deleteDate); | |
| } | |
| function deleteTriggers() { | |
| var triggers = ScriptApp.getProjectTriggers(); | |
| for (var i = 0; i < triggers.length; i++) { | |
| ScriptApp.deleteTrigger(triggers[i]); | |
| } | |
| } | |
| function processFormDataWithTrigger() { | |
| var columnNames = PropertiesService.getScriptProperties().getProperty('columnNames'); | |
| var deleteDate = PropertiesService.getScriptProperties().getProperty('deleteDate'); | |
| processFormData(columnNames, deleteDate); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment