-
-
Save ngohuunhut/ee0ed0e83ef3c8ce089fe8a59c7279d5 to your computer and use it in GitHub Desktop.
Telegram to Google Sheet: Subscribe to my channel: https://bit.ly/van-huy-dev-youtube
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Constants | |
const TOKEN = `<YourTokenHere>`; | |
const BASE_URL = `https://api.telegram.org/bot${TOKEN}`; | |
const CHAT_ID = '<ChatId>'; | |
const DEPLOYED_URL = '<YourScriptDeployedURL>'; | |
const SUM_CELL = 'G2'; | |
const METHODS = { | |
SEND_MESSAGE: 'sendMessage', | |
SET_WEBHOOK: 'setWebhook', | |
GET_UPDATES: 'getUpdates', | |
} | |
// Utils | |
const toQueryParamsString = (obj) => { | |
return Object.keys(obj) | |
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`) | |
.join('&'); | |
} | |
// Telegram APIs | |
const makeRequest = async (method, queryParams = {}) => { | |
const url = `${BASE_URL}/${method}?${toQueryParamsString(queryParams)}` | |
const response = await UrlFetchApp.fetch(url); | |
return response.getContentText(); | |
} | |
const sendMessage = (text) => { | |
makeRequest(METHODS.SEND_MESSAGE, { | |
chat_id: CHAT_ID, | |
text | |
}) | |
} | |
const setWebhook = () => { | |
makeRequest(METHODS.SET_WEBHOOK,{ | |
url: DEPLOYED_URL | |
}) | |
} | |
const getChatId = async () => { | |
const res = await makeRequest(METHODS.GET_UPDATES); | |
console.log("ChatId: ", JSON.parse(res)?.result[0]?.message?.chat?.id) | |
} | |
// Google Sheet | |
const addNewRow = (content = []) => { | |
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); | |
const Avals = sheet.getRange("A1:A").getValues(); | |
const Alast = Avals.filter(String).length; | |
const columnNumber = content.length; | |
const newRow = sheet.getRange(Alast + 1, 1, 1, columnNumber); | |
newRow.setValues([content]); | |
} | |
// Extract label & price | |
const getMultiplyBase = (unitLabel) => { | |
switch (unitLabel) { | |
case 'k': | |
case 'K': | |
case 'nghìn': | |
case 'ng': | |
case 'ngàn': | |
return 1000; | |
case 'lít': | |
case 'lit': | |
case 'l': | |
return 100000; | |
case 'củ': | |
case 'tr': | |
case 'm': | |
case 'M': | |
return 1000000; | |
default: | |
return 1; | |
} | |
}; | |
const addExpense = (text) => { | |
const regex = /(.*)\s(\d*)(\w*)/g; | |
const label = text.replace(regex, '$1'); | |
const priceText = text.replace(regex, '$2'); | |
const unitLabel = text.replace(regex, '$3'); | |
const time = new Date().toLocaleString(); | |
const price = Number(priceText) * getMultiplyBase(unitLabel); | |
addNewRow([time, label, price]); | |
} | |
// Webhooks | |
const doPost = (request) =>{ | |
const contents = JSON.parse(request.postData.contents); | |
const text = contents.message.text; | |
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); | |
addExpense(text); | |
const totalExpenses = sheet.getRange(SUM_CELL).getValue().toLocaleString('vi-VN', {style : 'currency', currency : 'VND'}); | |
sendMessage(`Tổng chi tiêu: ${totalExpenses}`); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment