splid-js-googlesheet-updater/app.js

136 lines
No EOL
3.8 KiB
JavaScript

import { SplidClient } from 'splid-js';
import { google } from "googleapis";
import {
NAME_ALIASES,
SPREADSHEET_ID,
SHEETS_CONFIG,
SHEET_RANGES,
TABLE_RESET_ROW_COUNT,
TABLE_COLUMN_COUNT,
SHEET_ID,
COLUMN_INDICES
} from './constants.js';
function getNameFromAlias(alias) {
return NAME_ALIASES[alias.toLowerCase()] || NAME_ALIASES['default'];
}
// Create a reusable sheets API client
async function createSheetsClient() {
const auth = new google.auth.GoogleAuth(SHEETS_CONFIG);
return google.sheets({ version: 'v4', auth });
}
// Get data from Google Sheets
async function getSheetData(spreadsheetId, range) {
try {
const sheets = await createSheetsClient();
const response = await sheets.spreadsheets.values.get({
spreadsheetId,
range
});
return response.data.values;
} catch (err) {
console.error('Error getting sheet data:', err);
throw err;
}
}
// Update data in Google Sheets
async function updateSheetData(spreadsheetId, range, values) {
try {
const sheets = await createSheetsClient();
const response = await sheets.spreadsheets.values.update({
spreadsheetId,
range,
valueInputOption: 'USER_ENTERED',
resource: { values },
});
return response.data;
} catch (err) {
console.error('Error updating sheet data:', err);
throw err;
}
}
async function getSplidData(splidCode) {
const splid = new SplidClient();
const groupRes = await splid.group.getByInviteCode(splidCode);
const groupId = groupRes.result.objectId;
const groupInfo = await splid.groupInfo.getOneByGroup(groupId);
const members = await splid.person.getAllByGroup(groupId);
const expensesAndPayments = await splid.entry.getAllByGroup(groupId);
const balance = SplidClient.getBalance(
members,
expensesAndPayments,
groupInfo
);
// Create a map of member IDs to their names/initials
const memberMap = {};
for (const member of members) {
memberMap[member.GlobalId] = {
name: member.name,
emoji: getNameFromAlias(member.name)
};
}
// Enhance the balance object with member information
const enhancedBalance = {};
for (const [memberId, balanceInfo] of Object.entries(balance)) {
enhancedBalance[memberId] = {
...balanceInfo,
memberInfo: memberMap[memberId] || { name: 'Unknown', emoji: NAME_ALIASES['default'] }
};
}
return enhancedBalance;
}
async function resetTableData() {
// Create an array of arrays with "-" for each cell
const dashData = Array(TABLE_RESET_ROW_COUNT).fill().map(() => Array(TABLE_COLUMN_COUNT).fill("-"));
try {
await updateSheetData(SPREADSHEET_ID, SHEET_RANGES.DATA_RESET, dashData);
} catch (err) {
console.error('Error resetting table data:', err);
throw err;
}
}
async function main() {
const splidCodes = await getSheetData(SPREADSHEET_ID, SHEET_RANGES.SPLID_CODES);
const userTags = await getSheetData(SPREADSHEET_ID, SHEET_RANGES.USER_TAGS);
console.log(splidCodes);
console.log("Resetting table data.")
await resetTableData();
for (let i = 0; i < splidCodes.length; i++) {
const splidCodeString = splidCodes[i][0];
if (!splidCodeString) {
continue;
}
console.log(`Processing Splid code: ${splidCodeString}`);
const balance = await getSplidData(splidCodeString);
const rowData = [];
for (const tag of userTags[0]) {
const memberEntry = Object.entries(balance).find(([_, info]) => info.memberInfo.emoji === tag);
const balanceValue = memberEntry ?
String(memberEntry[1].balance).replace('.', ',') :
'-';
rowData.push(balanceValue);
}
// Update the sheet with the row data
await updateSheetData(SPREADSHEET_ID, SHEET_RANGES.DATA_ROW(i), [rowData]);
}
}
main().catch(console.error);