function fetchGladiatusData() { const url = "https://s61-pl.gladiatus.gameforge.com/game/index.php?mod=highscore&sh=451febb35cf7ff10b6d30a7fb7cf30f3"; const pageRanges = [...Array(20).keys()].map(x => x + 1); // Zakresy od 1 do 20 stron let allData = []; let isFirstPage = true; pageRanges.forEach(page => { const html = fetchHtmlForPage(page); const tables = getTablesFromHtml(html); if (tables.length > 0) { const tableData = tables[0]; allData = isFirstPage ? allData.concat(tableData) : allData.concat(tableData.slice(1)); isFirstPage = false; } }); const sheetName = new Date().toISOString().split("T")[0]; saveToSheet(sheetName, allData); // Funkcja pomocnicza: pobieranie HTML dla danej strony function fetchHtmlForPage(page) { const options = { method: "post", payload: { a: page }, followRedirects: true, muteHttpExceptions: true }; return UrlFetchApp.fetch(url, options).getContentText(); } // Funkcja pomocnicza: ekstrakcja tabel z HTML function getTablesFromHtml(html) { const tableRegex = /([\s\S]*?)<\/table>/g; const tables = []; let match; while ((match = tableRegex.exec(html)) !== null) { tables.push(match[2]); } return tables.map(parseTable); } // Funkcja pomocnicza: parsowanie tabel HTML na dane function parseTable(tableHtml) { const rowRegex = /([\s\S]*?)<\/tr>/g; const cellRegex = /([\s\S]*?)<\/t[dh]>/g; const rows = []; let rowMatch; while ((rowMatch = rowRegex.exec(tableHtml)) !== null) { const cells = []; let cellMatch; while ((cellMatch = cellRegex.exec(rowMatch[1])) !== null) { cells.push(cleanHtml(cellMatch[1])); } rows.push(cells); } return rows; } // Funkcja pomocnicza: czyszczenie HTML function cleanHtml(html) { return html.replace(/<.*?>/g, "").trim(); } // Funkcja pomocnicza: zapis danych do arkusza function saveToSheet(sheetName, data) { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); let sheet = spreadsheet.getSheetByName(sheetName); if (!sheet) { sheet = spreadsheet.insertSheet(sheetName); } sheet.clear(); sheet.getRange(1, 1, data.length, data[0].length).setValues(data); } } ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| function updateStartSheetWithHistory() { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const startSheet = spreadsheet.getSheetByName("Start"); const today = new Date(); // Pobierz wszystkie nicki z kolumny "A" w arkuszu "Start" const nicknames = startSheet.getRange("A2:A").getValues().flat().filter(n => n); // Iteruj od 0 do 6 dni wstecz for (let daysAgo = 0; daysAgo < 7; daysAgo++) { const targetDate = new Date(today); targetDate.setDate(today.getDate() - daysAgo); const sheetName = targetDate.toISOString().split("T")[0]; // Nazwa arkusza w formacie YYYY-MM-DD const targetSheet = spreadsheet.getSheetByName(sheetName); if (!targetSheet) { console.warn(`Arkusz z datą ${sheetName} nie istnieje, pomijam.`); continue; // Jeśli arkusz nie istnieje, przejdź do następnego dnia } // Pobierz dane z arkusza historycznego const historyData = targetSheet.getDataRange().getValues(); // Pobierz całą tabelę // Mapuj dane z arkusza historycznego: klucz = nickname, wartość = kolumna D const historyDataMap = new Map(); historyData.forEach(row => { const nickname = row[1]; // Kolumna "B" w arkuszu (indeks 1) const value = row[3]; // Kolumna "D" w arkuszu (indeks 3) if (nickname) { historyDataMap.set(nickname, value); } }); // Wypełnij odpowiednią kolumnę w arkuszu "Start" const output = nicknames.map(nickname => [historyDataMap.get(nickname) || ""]); // Jeśli brak wartości, zostaw pustą komórkę const columnIndex = 2 + daysAgo; // Kolumna "C" = 3, "D" = 4, ..., "I" = 9 startSheet.getRange(2, columnIndex, output.length, 1).setValues(output); } }