-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathapp_script_api.gs
More file actions
94 lines (82 loc) · 3.26 KB
/
Copy pathapp_script_api.gs
File metadata and controls
94 lines (82 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
* KONFIGURASI
* Harap isi variabel di bawah ini sebelum melakukan deployment.
*/
const SECRET_KEY = "Kunci Rahasia Anda"; // Kunci rahasia
/**
* Fungsi utama yang akan dijalankan saat ada request POST ke URL Web App.
* Fungsi ini bertugas menerima file, membuat folder harian, dan menyimpannya ke Google Drive.
* @param {object} e - Objek event yang berisi parameter request.
* @returns {ContentService.TextOutput} - Respons JSON yang berisi status dan URL file.
*/
function doPost(e) {
// 1. Validasi Keamanan & Parameter
if (e.parameter.secret !== SECRET_KEY) {
return createJsonResponse({
status: 'error',
message: 'Akses ditolak: Kunci rahasia tidak valid.'
});
}
const { file, filename, mimetype, folderId, subfolder } = e.parameter;
if (!file || !filename || !mimetype || !folderId) {
return createJsonResponse({
status: 'error',
message: 'Request tidak lengkap. Parameter file, filename, mimetype, dan folderId wajib ada.'
});
}
try {
// 2. Dekode dan Buat Blob File
const decodedFile = Utilities.base64Decode(file, Utilities.Charset.UTF_8);
const blob = Utilities.newBlob(decodedFile, mimetype, filename);
// 3. Tentukan Folder Tujuan Utama
const targetFolder = DriveApp.getFolderById(folderId);
// 4. Buat Subfolder Harian (jika belum ada)
const now = new Date();
const formattedDate = Utilities.formatDate(now, "GMT+7", "dd-MM-yyyy");
const dailyFolderName = "Backup " + formattedDate;
let dailyFolder;
const dailyFolders = targetFolder.getFoldersByName(dailyFolderName);
if (dailyFolders.hasNext()) {
dailyFolder = dailyFolders.next();
} else {
dailyFolder = targetFolder.createFolder(dailyFolderName);
}
// 5. Tentukan Folder Penyimpanan Akhir (di dalam folder harian)
let destinationFolder = dailyFolder;
if (subfolder) {
// Jika ada parameter subfolder (misal: "bukti" atau "gambar_stok"),
// buat atau gunakan subfolder tersebut di dalam folder harian.
const subfolders = dailyFolder.getFoldersByName(subfolder);
if(subfolders.hasNext()){
destinationFolder = subfolders.next();
} else {
destinationFolder = dailyFolder.createFolder(subfolder);
}
}
// Jika tidak ada parameter 'subfolder', file akan disimpan langsung di folder harian (untuk file CSV).
// 6. Simpan File dan Atur Izin
const newFile = destinationFolder.createFile(blob);
newFile.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
// 7. Kirim Respons Sukses
return createJsonResponse({
status: 'success',
url: newFile.getUrl()
});
} catch (error) {
// Tangani Error
console.error("Gagal mengunggah file: " + error.toString());
return createJsonResponse({
status: 'error',
message: 'Terjadi kesalahan internal saat menyimpan file ke Drive: ' + error.toString()
});
}
}
/**
* Fungsi helper untuk membuat respons dalam format JSON.
* @param {object} data - Objek JavaScript yang akan diubah menjadi JSON.
* @returns {ContentService.TextOutput} - Objek respons JSON.
*/
function createJsonResponse(data) {
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}