-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcode.gs
333 lines (241 loc) · 8.4 KB
/
code.gs
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
// kredensial
const spreadsheetId = ''
const dataOrderSheetName = 'Data Order'
const logSheetName = 'Log'
const botHandle = ''
const botToken = ''
const appsScriptUrl = ''
const telegramApiUrl = `https://api.telegram.org/bot${botToken}`
function log(logMessage = '') {
// akses sheet
const spreadsheet = SpreadsheetApp.openById(spreadsheetId)
const sheet = spreadsheet.getSheetByName(logSheetName)
const lastRow = sheet.getLastRow()
const row = lastRow + 1
// inisiasi nilai
const today = new Date
// insert row kosong
sheet.insertRowAfter(lastRow)
// insert data
sheet.getRange(`A${row}`).setValue(today)
sheet.getRange(`B${row}`).setValue(logMessage)
}
function formatDate(date) {
const monthIndoList = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nov', 'Des']
const dateIndo = date.getDate()
const monthIndo = monthIndoList[date.getMonth()]
const yearIndo = date.getFullYear()
const result = `${dateIndo} ${monthIndo} ${yearIndo}`
return result
}
function sendTelegramMessage(chatId, replyToMessageId, textMessage) {
// url kirim pesan
const url = `${telegramApiUrl}/sendMessage`;
// payload
const data = {
parse_mode : 'HTML',
chat_id : chatId,
reply_to_message_id : replyToMessageId,
text : textMessage,
disable_web_page_preview: true,
}
const options = {
method : 'post',
contentType: 'application/json',
payload : JSON.stringify(data)
}
const response = UrlFetchApp.fetch(url, options).getContentText()
return response;
}
function parseMessage(message = '') {
// pisahkan berdasarkan karakter enter
const splitted = message.split('\n')
// inisiasi variabel
let nama = ''
let kodeBarang = ''
let alamat = ''
let resi = ''
// parsing pesan untuk mencari nilai variabel
splitted.forEach(el => {
nama = el.includes('Nama:') ? el.split(':')[1].trim().replaceAll('\n', ' ') : nama;
kodeBarang = el.includes('Kode Barang:') ? el.split(':')[1].trim().replaceAll('\n', ' ') : kodeBarang;
alamat = el.includes('Alamat:') ? el.split(':')[1].trim().replaceAll('\n', ' ') : alamat;
resi = el.includes('Resi:') ? el.split(':')[1].trim().replaceAll('\n', ' ') : resi;
})
// kumpulkan hasil
const result = {
nama : nama,
kodeBarang: kodeBarang,
alamat : alamat,
resi : resi,
}
// jika data kosong
const isEmpty = (nama === '' && kodeBarang === '' && alamat === '' && resi === '')
return isEmpty ? false : result
}
function inputDataOrder(data) {
try {
// akses sheet
const spreadsheet = SpreadsheetApp.openById(spreadsheetId)
const sheet = spreadsheet.getSheetByName(dataOrderSheetName)
const lastRow = sheet.getLastRow()
const row = lastRow + 1
// inisiasi nilai
const number = lastRow
const idOrder = `ORD-${number}`
const today = new Date
// insert row kosong
sheet.insertRowAfter(lastRow)
// insert data
sheet.getRange(`A${row}`).setValue(number)
sheet.getRange(`B${row}`).setValue(idOrder)
sheet.getRange(`C${row}`).setValue(today)
sheet.getRange(`D${row}`).setValue(data['nama'])
sheet.getRange(`E${row}`).setValue(data['kodeBarang'])
sheet.getRange(`F${row}`).setValue(data['alamat'])
sheet.getRange(`G${row}`).setValue(data['resi'])
sheet.getRange(`H${row}`).setValue('Sedang dikemas')
sheet.getRange(`I${row}`).setValue(data['chatId'])
// jika berhasil, return idOrder
return idOrder
} catch(err) {
return false
}
}
function cekResi(resi = null) {
// cegah resi kosong
if (!resi) {
return 'Format pencarian resi tidak valid.'
}
// akses sheet
const spreadsheet = SpreadsheetApp.openById(spreadsheetId)
const sheet = spreadsheet.getSheetByName(dataOrderSheetName)
const lastRow = sheet.getLastRow()
// ambil data
const range = `A2:I${lastRow}`
const dataList = sheet.getRange(range).getValues()
// filter data
const dataListFiltered = dataList.filter(el => el[6].toString().toLowerCase() === resi.toString().toLowerCase())
// cek jika resi ditemukan
const isResiFound = dataListFiltered.length > 0
// variabel balasan
let messageReply = ''
// jika ditemukan
if (isResiFound) {
// jika ada no resi yang sama, yang diambil yang paling atas
const data = dataListFiltered[0]
messageReply = `Info Resi <b>${resi}</b>
ID Order: ${data[1]}
Tanggal Order: ${formatDate(data[2])}
Nama: ${data[3]}
Kode Barang: ${data[4]}
Alamat: ${data[5]}
Status Pengiriman: <b>${data[7]}</b>`
// jika tidak
} else {
messageReply = `Resi ${resi} tidak ditemukan.`
}
return messageReply
}
function handleUpdateDeliveryStatus(e) {
// ambil info sheet dan row yang baru diedit
const row = e.range.getRow()
const column = e.range.getA1Notation().replace(/[^a-zA-Z]/g, '')
const sheetName = e.range.getSheet().getSheetName()
// jika perubahan bukan pada sheet data order kolom H
if (sheetName !== dataOrderSheetName || column !== 'H') {
return false
}
// akses sheet
const spreadsheet = SpreadsheetApp.openById(spreadsheetId)
const sheet = spreadsheet.getSheetByName(dataOrderSheetName)
const today = new Date
// ambil data
const range = `A${row}:I${row}`
const data = sheet.getRange(range).getValues()
// isi konstanta
const idOrder = data[0][1]
const tanggalOrder = data[0][2]
const nama = data[0][3]
const kodeBarang = data[0][4]
const alamat = data[0][5]
const resi = data[0][6]
const statusPengiriman = data[0][7]
const chatId = data[0][8].toString()
const textMessage = `Update Info Resi <b>${resi}</b>
ID Order: ${idOrder}
Tanggal Order: ${formatDate(tanggalOrder)}
Nama: ${nama}
Kode Barang: ${kodeBarang}
Alamat: ${alamat}
Status Pengiriman: <b>${statusPengiriman}</b>
<i>Data per-${formatDate(today)}</i>`
// kirim pesan
sendTelegramMessage(chatId, null, textMessage)
}
function doPost(e) {
try {
// urai pesan masuk
const contents = JSON.parse(e.postData.contents)
const chatId = contents.message.chat.id
const receivedTextMessage = contents.message.text.replace(botHandle, '').trim() // hapus botHandle jika pesan berasal dari grup
const messageId = contents.message.message_id
let messageReply = ''
// 1. jika pesan /start
if (receivedTextMessage.toLowerCase() === '/start') {
// tulis pesan balasan
messageReply = `Halo! Status bot dalam keadaan aktif.`
// 2. jika pesan diawali dengan /input
} else if (receivedTextMessage.split('\n')[0].toLowerCase() === '/input') {
const parsedMessage = parseMessage(receivedTextMessage)
// 2a.jika ada data
if (parsedMessage) {
const data = {
nama : parsedMessage['nama'],
kodeBarang: parsedMessage['kodeBarang'],
alamat : parsedMessage['alamat'],
resi : parsedMessage['resi'],
chatId : chatId
}
// insert data ke sheet
const idOrder = inputDataOrder(data)
// tulis pesan balasan
messageReply = idOrder ? `Data berhasil disimpan dengan ID Order <b>${idOrder}</b>` : 'Data gagal disimpan'
// 2b. jika tidak ada data
} else {
messageReply = 'Data kosong dan tidak dapat disimpan'
}
// 3. cek resi
} else if (receivedTextMessage.split(' ')[0].toLowerCase() === '/resi') {
// ambil resi
const resi = receivedTextMessage.split(' ')[1]
// ambil info
messageReply = cekResi(resi)
// 4. format
} else if (receivedTextMessage.toLowerCase() === '/format') {
messageReply = `Untuk <b>input data order</b> gunakan format:
<pre>/input
Nama:
Kode Barang:
Alamat:
Resi: </pre>
Untuk <b>cek resi</b> gunakan format:
<pre>/resi [nomor resi]</pre>
(Tanpa tanda kurung siku)`
// 5. format salah
} else {
messageReply = `Pesan yang Anda kirim tidak sesuai format.
Kirim perintah /format untuk melihat daftar format pesan yang tersedia.`
}
// kirim pesan balasan
sendTelegramMessage(chatId, messageId, messageReply)
} catch(err) {
log(err)
}
}
function setWebhook() {
// akses api
const url = `${telegramApiUrl}/setwebhook?url=${appsScriptUrl}`
const response = UrlFetchApp.fetch(url).getContentText()
Logger.log(response)
}