Skip to content

Instantly share code, notes, and snippets.

@kninami
Created September 30, 2024 02:02
Show Gist options
  • Select an option

  • Save kninami/39597f415bd6c50cf679dcb8edf9abce to your computer and use it in GitHub Desktop.

Select an option

Save kninami/39597f415bd6c50cf679dcb8edf9abce to your computer and use it in GitHub Desktop.
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