Finanse chcą kwartalny przegląd nieobecności, menedżer potrzebuje arkusza obciążenia zespołu, HR prowadzi główny arkusz — wcześniej czy później dane o urlopach trafiają do Google Sheets. Zamiast kopiować i wklejać, możesz mieć arkusz, który sam się wypełnia i odświeża danymi z REST API Collabin za pomocą Google Apps Script: bez serwerów, bez kosztów, około trzydziestu linii kodu, gotowych do skopiowania.
Czego będziesz potrzebować
- Konta Collabin w planie Pro z kluczem API tylko do odczytu (jak go wygenerować, opisuje przewodnik API quickstart — do raportu wystarczy klucz tylko do odczytu).
- Konta Google i pustego arkusza Google Sheets.
Krok 1: Otwórz edytor skryptów i bezpiecznie zapisz klucz
W arkuszu wybierz Rozszerzenia → Apps Script. Przed napisaniem kodu zapisz klucz API tam, gdzie nie jest częścią kodu: w edytorze otwórz Ustawienia projektu → Właściwości skryptu i dodaj właściwość o nazwie COLLABIN_API_KEY, jako wartość podając swój klucz. Właściwości skryptu nie znajdują się w samym kodzie, w historii wersji, ani nie są widoczne dla osób, z którymi udostępnisz arkusz.
Krok 2: Wklej skrypt
Zamień zawartość edytora na poniższy kod:
const BASE_URL = 'https://api.collabin.eu';
function syncCollabinLeaves() {
const apiKey = PropertiesService.getScriptProperties()
.getProperty('COLLABIN_API_KEY');
if (!apiKey) {
throw new Error('Dodaj COLLABIN_API_KEY w Ustawienia projektu → Właściwości skryptu.');
}
const year = new Date().getFullYear();
const leaves = fetchAll(
'/v1/leaves?status=APPROVED&start=' + year + '-01-01&end=' + year + '-12-31',
apiKey
);
const rows = leaves.map(function (l) {
return [
l.user ? l.user.name : '#' + l.user_id,
l.leave_type ? l.leave_type.name : '',
l.start_date.slice(0, 10),
l.end_date.slice(0, 10),
l.is_half_day ? 'tak' : 'nie',
l.status
];
});
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Urlopy') || ss.insertSheet('Urlopy');
sheet.clearContents();
sheet.getRange(1, 1, 1, 6)
.setValues([['Imię i nazwisko', 'Typ', 'Od', 'Do', 'Pół dnia', 'Status']]);
if (rows.length > 0) {
sheet.getRange(2, 1, rows.length, 6).setValues(rows);
}
sheet.getRange('A1:F1').setFontWeight('bold');
}
// Przechodzi przez endpoint listy /v1 i zwraca wszystkie elementy.
function fetchAll(path, apiKey) {
const sep = path.indexOf('?') === -1 ? '?' : '&';
const limit = 500; // maksimum API
let offset = 0;
let all = [];
for (;;) {
const url = BASE_URL + path + sep + 'limit=' + limit + '&offset=' + offset;
const res = UrlFetchApp.fetch(url, {
headers: { 'X-API-Key': apiKey }
});
const body = JSON.parse(res.getContentText());
all = all.concat(body.data);
if (body.data.length === 0 || all.length >= body.total) {
return all;
}
offset += limit;
}
}
Kilka rzeczy, które ten skrypt robi dobrze, a które rozwiązania ad hoc zwykle przeoczają:
- Paginacja. Endpointy list zwracają maksymalnie 500 elementów na wywołanie;
fetchAllprzechodzi przez parametrylimit/offset, aż pobierze wszystko, dzięki czemu raport pozostaje poprawny, gdy historia przekroczy jedną stronę. - Nazwy są już dołączone. Odpowiedź dla urlopów zawiera zagnieżdżone obiekty
userileave_type, więc nie jest potrzebne drugie zapytanie ani funkcja WYSZUKAJ.PIONOWO. - Filtr dat działa na zasadzie nakładania się okresów — urlop, który zaczął się w grudniu, a kończy w styczniu, pojawi się w raportach obu lat.
Krok 3: Uruchom raz i zatwierdź uprawnienia
Wybierz syncCollabinLeaves na pasku narzędzi i kliknij Uruchom. Google poprosi o autoryzację skryptu (potrzebuje dostępu do arkusza i możliwości wywołania zewnętrznej usługi) — to dzieje się tylko raz. Po kilku sekundach zakładka Urlopy będzie zawierać dane.
Krok 4: Skonfiguruj automatyczne odświeżanie
W edytorze skryptów otwórz Wyzwalacze (ikona budzika) i dodaj wyzwalacz: funkcja syncCollabinLeaves, źródło zdarzenia Czasowe, np. każdego ranka między 6 a 7. Od teraz arkusz jest zawsze aktualny — tabele przestawne, wykresy i formuły QUERY() oparte na zakładce Urlopy aktualizują się wraz z nim.
Co można dobudować
- Tabela przestawna dni na osobę: wstaw tabelę przestawną w zakładce Urlopy — wiersze: Imię i nazwisko, wartości: ILE.NIEPUSTYCH z kolumny Od — szybka liczba wniosków na osobę.
- Wnioski oczekujące: zmień
status=APPROVEDnastatus=PENDING, aby uzyskać panel zaległości w zatwierdzaniu. - Historia jednej osoby: dodaj
&user_id=7do ścieżki, aby tworzyć indywidualne arkusze raportów. - Synchronizacja przyrostowa: w bardzo dużych organizacjach pobieraj tylko zmiany za pomocą
updated_sincei scalaj je, zamiast przepisywać cały arkusz.
Pamiętaj o limicie zapytań
API pozwala na 120 zapytań na minutę na klucz. Powyższy skrypt wykonuje jedno zapytanie na 500 rekordów, więc nawet duża historia to tylko kilka wywołań — ale jeśli budujesz coś bardziej „rozmowne", wybieraj większe strony zamiast większej liczby zapytań i rozkładaj wyzwalacze w czasie, a nie synchronizuj co minutę.