Sistem ini menghubungkan:
Google Sheets → Node.js Backend → Slack Bot → Update kembali ke Google Sheets
- Data QnA masuk ke Google Sheets
- Apps Script trigger mengirim event ke backend
- Backend mengirim pesan ke Slack
- User klik tombol "Jawab"
- Modal muncul
- Jawaban disubmit
- Backend update kembali ke Google Sheets
Google Sheets (Apps Script Trigger)
↓
Node.js Backend
↓
Slack Bot (Interactive + Modal)
↓
Node.js Backend
↓
Update Google Sheets
- Buka https://api.slack.com/apps
- Klik "Create New App"
- Pilih "From Scratch"
- Beri nama app
- Pilih workspace
Masuk ke:
OAuth & Permissions
Tambahkan Bot Token Scopes:
- chat:write
- commands
- channels:read
- channels:join
Klik "Install to Workspace"
Copy Bot User OAuth Token
Simpan sebagai environment variable:
SLACK_BOT_TOKEN
Masuk ke:
Interactivity & Shortcuts
Enable Interactivity → ON
Isi Request URL:
https://your-ngrok-url.ngrok-free.app/slack-action
Save.
Di Slack channel:
/invite @your-bot-name
Ambil Channel ID dari URL Slack (format seperti C1234567890)
Simpan sebagai:
CHANNEL_ID
Contoh struktur:
| No | NIM | Pertanyaan (Mahasiswa) | Jawaban (Asisten) | Tanggapan (Mahasiswa) | Tanggapan (Assisten) |
|---|---|---|---|---|---|
| 1 | 13522120 | Kenapa harus Labpro? | Karena bisa belajar banyak core programming | Ahh masa, bukannya karena duit? | heheheh |
- Buka https://console.cloud.google.com/
- Create Project
- Enable "Google Sheets API"
- Go to Credentials
- Create Credentials → Service Account
- Download JSON file
Rename menjadi:
service-account.json
Letakkan di root project.
Buka Google Sheets → Share
Masukkan email service account:
your-service-account@project-id.iam.gserviceaccount.com
Beri akses Editor.
Jika tidak dilakukan → akan muncul permission error.
Di Google Sheets:
Extensions → Apps Script
Berikut adalah contoh script yang dapat digunakan:
function onEdit(e) {
const sheet = e.source.getActiveSheet();
const row = e.range.getRow();
const col = e.range.getColumn();
console.log("Sheet: "+ sheet)
console.log("col, row" + col+" "+row)
if (row > 8 && (col == 4 || col == 6)) {
const id = sheet.getRange(row, 2).getValue();
const nim = sheet.getRange(row, 3).getValue();
const question = sheet.getRange(row, col).getValue();
console.log(question)
if (id && nim && question && sheet.getRange(row, col+1).getValue() == "") {
let payload = {
id: id,
nim: nim,
question: question,
rowToAns: row,
colToAns: col+1,
};
if(col==6){
const thread = {
"q1": sheet.getRange(row, 4).getValue(),
"a1": sheet.getRange(row, 5).getValue(),
}
payload = {
...payload, thread
}
}
console.log(payload)
try{
UrlFetchApp.fetch("your endpoint", {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload)
});
}catch(err){
console.error(err)
}
}
}
}npm init -y
npm install express googleapis dotenv node-fetchproject/
├─ app.js
├─ service-account.json
├─ .env
PORT=3000
SLACK_BOT_TOKEN=xoxb-xxxxxxxx
CHANNEL_ID=CXXXXXXXX
SPREADSHEET_ID=your_spreadsheet_idAmbil SPREADSHEET_ID dari URL:
https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit
node app.js- Anda dapat mendeploynya secara locak lalu melakukan tunneling menggunakan ngrok ataupun melakukan deployment di vps kesayangan anda.
- Copy HTTPS URL.
- Update:
- Slack Interactivity URL
- Apps Script fetch URL