Compare commits
2 commits
b897fd5e5c
...
1b05f0453b
Author | SHA1 | Date | |
---|---|---|---|
1b05f0453b | |||
3a439285aa |
2 changed files with 112 additions and 99 deletions
69
app.js
69
app.js
|
@ -2,6 +2,7 @@ import { SplidClient } from 'splid-js';
|
|||
import { google } from "googleapis";
|
||||
import {
|
||||
NAME_ALIASES,
|
||||
ALIAS_TO_EMOJI,
|
||||
SPREADSHEET_ID,
|
||||
SHEETS_CONFIG,
|
||||
SHEET_RANGES,
|
||||
|
@ -11,8 +12,30 @@ import {
|
|||
COLUMN_INDICES
|
||||
} from './constants.js';
|
||||
|
||||
|
||||
async function setAliasesFromSheet() {
|
||||
const response = await getSheetData(SPREADSHEET_ID, SHEET_RANGES.ALIASES);
|
||||
|
||||
const emojis = response[0];
|
||||
|
||||
for (let col = 0; col < emojis.length; col++) {
|
||||
const emoji = emojis[col];
|
||||
NAME_ALIASES[emoji] = [];
|
||||
|
||||
for (let row = 1; row < response.length; row++) {
|
||||
const alias = response[row][col];
|
||||
if (alias && alias.trim() !== '') {
|
||||
const normalized = alias.toLowerCase();
|
||||
NAME_ALIASES[emoji].push(alias);
|
||||
ALIAS_TO_EMOJI[normalized] = emoji;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function getNameFromAlias(alias) {
|
||||
return NAME_ALIASES[alias.toLowerCase()] || NAME_ALIASES['default'];
|
||||
return ALIAS_TO_EMOJI[alias.toLowerCase()] || NAME_ALIASES['default'];
|
||||
}
|
||||
|
||||
// Create a reusable sheets API client
|
||||
|
@ -40,7 +63,7 @@ async function getSheetData(spreadsheetId, range) {
|
|||
async function updateSheetData(spreadsheetId, range, values) {
|
||||
try {
|
||||
const sheets = await createSheetsClient();
|
||||
const response = await sheets.spreadsheets.values.update({
|
||||
const response = sheets.spreadsheets.values.update({
|
||||
spreadsheetId,
|
||||
range,
|
||||
valueInputOption: 'USER_ENTERED',
|
||||
|
@ -83,11 +106,14 @@ async function getSplidData(splidCode) {
|
|||
for (const [memberId, balanceInfo] of Object.entries(balance)) {
|
||||
enhancedBalance[memberId] = {
|
||||
...balanceInfo,
|
||||
memberInfo: memberMap[memberId] || { name: 'Unknown', emoji: NAME_ALIASES['default'] }
|
||||
memberInfo: memberMap[memberId] || { name: 'Unknown', emoji: NAME_ALIASES['default'] },
|
||||
};
|
||||
}
|
||||
|
||||
return enhancedBalance;
|
||||
return {
|
||||
balance: enhancedBalance,
|
||||
groupName: groupInfo.name
|
||||
};
|
||||
}
|
||||
|
||||
async function resetTableData() {
|
||||
|
@ -134,6 +160,8 @@ async function autoResizeColumns(spreadsheetId, sheetId, startColumnIndex, endCo
|
|||
}
|
||||
|
||||
async function main() {
|
||||
let RAW = [];
|
||||
await setAliasesFromSheet();
|
||||
const splidCodes = await getSheetData(SPREADSHEET_ID, SHEET_RANGES.SPLID_CODES);
|
||||
const userTags = await getSheetData(SPREADSHEET_ID, SHEET_RANGES.USER_TAGS);
|
||||
|
||||
|
@ -141,35 +169,58 @@ async function main() {
|
|||
console.log("Resetting table data.")
|
||||
await resetTableData();
|
||||
|
||||
const groupNames = []; // Array to collect group names
|
||||
|
||||
for (let i = 0; i < splidCodes.length; i++) {
|
||||
const splidCodeString = splidCodes[i][0];
|
||||
if (!splidCodeString) {
|
||||
groupNames.push(['-']); // Add placeholder for empty rows
|
||||
continue;
|
||||
}
|
||||
console.log(`Processing Splid code: ${splidCodeString}`);
|
||||
const balance = await getSplidData(splidCodeString);
|
||||
const splidData = await getSplidData(splidCodeString);
|
||||
const balance = splidData.balance;
|
||||
|
||||
// Add group name to our collection
|
||||
groupNames.push([splidData.groupName]);
|
||||
|
||||
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('.', ',') :
|
||||
const matchingMembers = Object.entries(balance).filter(([_, info]) => info.memberInfo.emoji === tag);
|
||||
const totalBalance = matchingMembers.reduce((sum, [_, info]) => sum + parseFloat(info.balance), 0);
|
||||
const balanceValue = matchingMembers.length > 0 ?
|
||||
String(totalBalance.toFixed(2)).replace('.', ',') :
|
||||
'-';
|
||||
rowData.push(balanceValue);
|
||||
}
|
||||
|
||||
// Update the sheet with the row data
|
||||
await updateSheetData(SPREADSHEET_ID, SHEET_RANGES.DATA_ROW(i), [rowData]);
|
||||
RAW.push([`Row ${i} Data:`, JSON.stringify(rowData)]);
|
||||
RAW.push([`Balance ${i}:`, JSON.stringify(balance, null, 2)]);
|
||||
}
|
||||
|
||||
// Update column B with group names
|
||||
if (groupNames.length > 0) {
|
||||
const columnBRange = `B2:B${groupNames.length + 1}`; // B2 to B(2+count-1)
|
||||
await updateSheetData(SPREADSHEET_ID, columnBRange, groupNames);
|
||||
console.log(`Updated column B with ${groupNames.length} group names`);
|
||||
}
|
||||
|
||||
console.log("Sheets updated, adjusting column width.")
|
||||
|
||||
try {
|
||||
await autoResizeColumns(SPREADSHEET_ID, SHEET_ID, COLUMN_INDICES.E, COLUMN_INDICES.M);
|
||||
await autoResizeColumns(SPREADSHEET_ID, SHEET_ID, COLUMN_INDICES.F, COLUMN_INDICES.N);
|
||||
} catch (err) {
|
||||
console.error('Failed to auto-resize columns, but data was updated successfully:', err);
|
||||
}
|
||||
|
||||
RAW.push(['Splid Codes:', JSON.stringify(splidCodes)]);
|
||||
RAW.push(['User Tags:', JSON.stringify(userTags)]);
|
||||
|
||||
await updateSheetData(SPREADSHEET_ID, SHEET_RANGES.RAW, RAW);
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
|
||||
|
|
66
constants.js
66
constants.js
|
@ -1,53 +1,9 @@
|
|||
export const NAME_ALIASES = {
|
||||
// 🙃 aliases
|
||||
'vrouba von vrbicz': '🙃',
|
||||
'vróbič': '🙃',
|
||||
'vrba vrbička': '🙃',
|
||||
'jirka v.': '🙃',
|
||||
|
||||
// 👨🏭 aliases
|
||||
'párek z mourkova': '👨🏭',
|
||||
'marek': '👨🏭',
|
||||
'mourek': '👨🏭',
|
||||
'mourek (jen láhve)': '👨🏭',
|
||||
|
||||
// 🤒 aliases
|
||||
'kruzík ruzický': '🤒',
|
||||
'kruzík ruzík': '🤒',
|
||||
'krouzič': '🤒',
|
||||
|
||||
// 🤑 aliases
|
||||
'matuzalém kremžský': '🤑',
|
||||
'matuzalém i/ii.': '🤑',
|
||||
'matúš': '🤑',
|
||||
|
||||
// 😎 aliases
|
||||
'martin': '😎',
|
||||
'martin brony veleblil': '😎',
|
||||
'veleblil bobajz z broníkova': '😎',
|
||||
'bronos': '😎',
|
||||
|
||||
// 🤯 aliases
|
||||
'ja': '🤯',
|
||||
'kuba': '🤯',
|
||||
'kuba-buba': '🤯',
|
||||
"d'artakuba zlominoha": '🤯',
|
||||
'kuba zlominoha': '🤯',
|
||||
|
||||
// 😴 aliases
|
||||
'sam': '😴',
|
||||
'ditrpich von šalina': '😴',
|
||||
|
||||
// 🍖 aliases
|
||||
'šunka šunkovič šunkovský': '🍖',
|
||||
'šunka pražský': '🍖',
|
||||
'šunkovič': '🍖',
|
||||
'dan': '🍖',
|
||||
|
||||
// Default for unrecognized aliases
|
||||
export let NAME_ALIASES = {
|
||||
'default': 'Ostatní'
|
||||
};
|
||||
|
||||
export const ALIAS_TO_EMOJI = {};
|
||||
|
||||
export const SPREADSHEET_ID = '1RxeQTnirJILgqXDuvI2RQt9vljn1Jz_JFCzVDRQviIg';
|
||||
|
||||
// Google Sheets configuration
|
||||
|
@ -58,10 +14,13 @@ export const SHEETS_CONFIG = {
|
|||
|
||||
// Sheet ranges
|
||||
export const SHEET_RANGES = {
|
||||
SPLID_CODES: 'Splidy!C2:C',
|
||||
USER_TAGS: 'Splidy!E1:M1',
|
||||
DATA_RESET: 'Splidy!E2:M',
|
||||
DATA_ROW: (rowIndex) => `Splidy!E${rowIndex + 2}:M${rowIndex + 2}`
|
||||
SPLID_CODES: 'Splidy!D2:D',
|
||||
SPLID_NAMES: 'Splidy!B2:B',
|
||||
USER_TAGS: 'Splidy!F1:N1',
|
||||
DATA_RESET: 'Splidy!F2:N',
|
||||
DATA_ROW: (rowIndex) => `Splidy!F${rowIndex + 2}:N${rowIndex + 2}`,
|
||||
ALIASES: 'Přezdívky!A:H',
|
||||
RAW: 'raw'
|
||||
};
|
||||
|
||||
// Other constants
|
||||
|
@ -69,8 +28,11 @@ export const TABLE_RESET_ROW_COUNT = 100;
|
|||
export const TABLE_COLUMN_COUNT = 9; // Columns E through M
|
||||
|
||||
export const COLUMN_INDICES = {
|
||||
B: 2,
|
||||
E: 4,
|
||||
M: 12
|
||||
F: 5,
|
||||
M: 12,
|
||||
N: 13
|
||||
};
|
||||
|
||||
export const SHEET_ID = 0;
|
||||
|
|
Loading…
Reference in a new issue