3. App Script Bot-1 Telegram Saham Turun - oneoff di spreadsheet belum otomatis

/************************************************************ * FUNGSI 1 — UPDATE HARGA DARI GOOGLE FINANCE (SHEET: Data) ************************************************************/ function updateHarga() { const ss = SpreadsheetApp.getActive(); const sheet = ss.getSheetByName("Data"); const status = (sheet.getRange("A1").getValue() || "").toString().toUpperCase(); if (status !== "ON") { Logger.log("Update harga dimatikan oleh user (A1 != ON)"); return; } const tickers = sheet.getRange("B2:B1061").getValues(); tickers.forEach((row, i) => { const kode = row[0]; if (!kode) return; const formula = `=GOOGLEFINANCE("${kode}","price")`; sheet.getRange(i + 2, 3).setFormula(formula); // kolom C = harga }); Logger.log("Update harga selesai."); } /************************************************************ * Script otomatis menulis ON/OFF ke Sheet ************************************************************/ function syncOnOff() { const sheet = SpreadsheetApp.getActive().getSheetByName("Data"); const SYSTEM_MODE = "ON"; // ubah manual hanya di script sheet.getRange("A1").setValue(SYSTEM_MODE); Logger.log("Spreadsheet ON/OFF telah disinkronkan dari script."); } /************************************************************ * CONTOH FULL: updateHarga() pakai ON/OFF dari Script ************************************************************/ const SYSTEM_ENABLED = true; // ubah ON / OFF di sini function updateHarga() { if (!SYSTEM_ENABLED) { Logger.log("updateHarga() dimatikan oleh Script."); return; } const sheet = SpreadsheetApp.getActive().getSheetByName("Data"); const tickers = sheet.getRange("B2:B1061").getValues(); tickers.forEach((row, i) => { const kode = row[0]; if (!kode) return; sheet.getRange(i+2, 3) .setFormula(`=GOOGLEFINANCE("${kode}","price")`); }); Logger.log("Harga diupdate karena SYSTEM_ENABLED = true"); } /************************************************************ * CONTOH FULL: checkStockAlerts() pakai ON/OFF dari Script ************************************************************/ const ALERT_SYSTEM = true; // ON/OFF alert Telegram function checkStockAlerts() { if (!ALERT_SYSTEM) { Logger.log("Alert system OFF oleh script."); return; } const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); const data = sheet.getDataRange().getValues(); // ... lanjut kode alert ... } /************************************************************ * FUNGSI 2 — ALERT SAHAM (SHEET: Sheet1) ************************************************************/ function checkStockAlerts() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); const data = sheet.getDataRange().getValues(); const TELEGRAM_TOKEN = "TOKEN-KAMU"; const TELEGRAM_CHAT_ID = "CHAT-ID-KAMU"; let alerts = []; for (let i = 1; i < data.length; i++) { const row = data[i]; const onoff = (row[1] || "").toString().toLowerCase(); // kolom B (OnOff) if (onoff !== "on") continue; const kode = row[2]; // C const nama = row[3]; // D const harga = parseFloat(row[4]); // E const batasTurun = parseFloat(row[7]); // H const batasNaik = parseFloat(row[8]); // I const statusTurun = (row[9] || "").toLowerCase(); // J const statusNaik = (row[10] || "").toLowerCase(); // K Logger.log(`Row ${i+1}: ${kode} Harga=${harga}`); // 🎯 Alert Turun if (!isNaN(harga) && !isNaN(batasTurun) && harga < batasTurun && statusTurun !== "terkirim") { alerts.push(`🔻 ${kode} (${nama}) TURUN ke ${harga} (batas: ${batasTurun})`); sheet.getRange(i + 1, 10).setValue("terkirim"); // kolom J } // 🎯 Alert Naik if (!isNaN(harga) && !isNaN(batasNaik) && harga > batasNaik && statusNaik !== "terkirim") { alerts.push(`🔺 ${kode} (${nama}) NAIK ke ${harga} (batas: ${batasNaik})`); sheet.getRange(i + 1, 11).setValue("terkirim"); // kolom K } } if (alerts.length > 0) { const message = "📢 ALERT SAHAM:\n" + alerts.join("\n"); const url = `https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage`; UrlFetchApp.fetch(url, { method: "post", payload: { chat_id: TELEGRAM_CHAT_ID, text: message, }, }); } else { Logger.log("Tidak ada alert."); } } /************************************************************ * FUNGSI CEK ALERT SAHAM → TELEGRAM ************************************************************/ function checkStockAlerts() { if (!SYSTEM_ENABLED || !ALERT_ENABLED) { Logger.log("Alert system OFF."); return; } const sheet = SpreadsheetApp.getActive().getSheetByName("Sheet1"); const data = sheet.getDataRange().getValues(); let alerts = []; for (let i = 1; i < data.length; i++) { const row = data[i]; const onoff = (row[1] || "").toString().toLowerCase(); // kol B if (onoff !== "on") continue; const kode = row[2]; const nama = row[3]; const harga = parseFloat(row[4]); const batasTurun = parseFloat(row[7]); const batasNaik = parseFloat(row[8]); const statusTurun = (row[9] || "").toLowerCase(); const statusNaik = (row[10] || "").toLowerCase(); // Turun if (!isNaN(harga) && !isNaN(batasTurun) && harga < batasTurun && statusTurun !== "terkirim") { alerts.push(`🔻 ${kode} (${nama}) TURUN ke ${harga} (batas: ${batasTurun})`); sheet.getRange(i + 1, 10).setValue("terkirim"); } // Naik if (!isNaN(harga) && !isNaN(batasNaik) && harga > batasNaik && statusNaik !== "terkirim") { alerts.push(`🔺 ${kode} (${nama}) NAIK ke ${harga} (batas: ${batasNaik})`); sheet.getRange(i + 1, 11).setValue("terkirim"); } } if (alerts.length === 0) { Logger.log("Tidak ada alert."); return; } const text = "📢 ALERT SAHAM:\n" + alerts.join("\n"); UrlFetchApp.fetch(`https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage`, { method: "post", payload: { chat_id: TELEGRAM_CHAT_ID, text: text } }); }

Comments

Popular posts from this blog

Analisis Potensi Rebound Saham (compose view): Kode Python & colab.research.google.com

Proyek Scraping Python

Adaptasi Integrasi Fitur Vault HTML CSS JS ke Python