Geo Organizer -wklejanie tekstu
Geo Organizer -wklejanie tekstu
Witam, istnieje możliwość dodanie wklejania ( importu ) danych do nowej pracy lub w ogóle nowej opcji zakładania pracy na podstawie np google sheets? Mam arkusz w google gdzie dodaj klienta nr telefonu działkę itp. robi się to wszystko z automatu ale na koniec i tak zostaje ręczne wklepywanie do GeoOrganizera. Istnieje ewentualnie opcja dostępu do bazy danych Geoorganizera z zewnętrznej aplikacji np w formie API?
Re: Geo Organizer -wklejanie tekstu
Takie API zostało przedstawione w tym wątku : https://softline.geo.pl/forum/viewtopic ... 17&t=13378
Zapytałem chata czy można stworzyć makro do arkusza google który wysyła odpowiednią komendę do GeoOrganizera.
Zaproponował przykładowy kod, nie sprawdzałem, ale można powalczyć :
Zapytałem chata czy można stworzyć makro do arkusza google który wysyła odpowiednią komendę do GeoOrganizera.
Zaproponował przykładowy kod, nie sprawdzałem, ale można powalczyć :
Kod: Zaznacz cały
/**
* @OnlyCurrentDoc
* Ten skrypt dodaje niestandardowe menu do arkusza Google,
* które pozwala na wysłanie danych o pracy geodezyjnej do API C-GEO
* w poprawnym formacie JSON dla usługi 'addpraca'.
*/
/**
* Funkcja uruchamiana przy otwarciu arkusza. Tworzy niestandardowe menu.
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('API C-GEO (addpraca)')
.addItem('Wyślij zaznaczoną robotę do serwera', 'sendJobDataJson')
.addToUi();
}
/**
* Główna funkcja, która pobiera dane z wiersza, formatuje je w strukturę JSON i wysyła do API.
*/
function sendJobDataJson() {
const ui = SpreadsheetApp.getUi();
// --- Konfiguracja ---
// ZMIEŃ PONIŻSZY ADRES NA ADRES TWOJEGO SERWERA!
const serverBaseUrl = 'http://localhost:8000'; // np. http://192.168.1.100:8000
const endpoint = '/root/addpraca';
const serverUrl = serverBaseUrl + endpoint;
// Określ, w których kolumnach znajdują się odpowiednie dane.
// 1 = kolumna A, 2 = kolumna B, itd. Dostosuj do swojego arkusza.
const columnMapping = {
NumerRoboty: 1, // (Wymagane) Identyfikator roboty (np. G.123.2024)
OpisRoboty: 2, // (Opcjonalne) Nazwa/opis (np. mapa do celów projektowych)
DokMiejsc: 3, // (Opcjonalne) Miejscowość (np. Kowale)
OpiekunRoboty: 4, // (Opcjonalne) Kierownik/Opiekun (np. Jan Nowak)
DataRozpoczecia: 5, // (Opcjonalne) Data rozpoczęcia w formacie RRRR-MM-DD
DataPlanZakonczenia: 6,// (Opcjonalne) Planowana data zakończenia w formacie RRRR-MM-DD
UserData_Dane_dod1: 7, // (Opcjonalne) Twoje pole dodatkowe 1
UserData_Dane_dod2: 8 // (Opcjonalne) Twoje pole dodatkowe 2
};
// --------------------
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getActiveRange();
if (range.getNumRows() !== 1) {
ui.alert('Proszę zaznaczyć dokładnie jeden wiersz, który chcesz wysłać.');
return;
}
const rowNum = range.getRow();
// Funkcja pomocnicza do pobierania wartości z komórki. Zwraca pusty string, jeśli komórka jest pusta.
const getValue = (colName) => {
if (!columnMapping[colName]) return ""; // Zabezpieczenie, jeśli mapowanie nie istnieje
const cell = sheet.getRange(rowNum, columnMapping[colName]);
// Dla dat, pobierz sformatowaną wartość, aby uniknąć problemów ze strefą czasową
if (colName.toLowerCase().includes('data')) {
return cell.getDisplayValue().trim();
}
return cell.getValue().toString().trim();
};
const numerRoboty = getValue('NumerRoboty');
if (!numerRoboty) {
ui.alert('Operacja przerwana. Kolumna z "NumerRoboty" (wg mapowania: kolumna ' + columnMapping.NumerRoboty + ') musi być wypełniona.');
return;
}
// Budowanie obiektu z danymi (payload) zgodnie z wymaganą strukturą
const payloadObject = {
NumerRoboty: numerRoboty,
OpisRoboty: getValue('OpisRoboty'),
DokMiejsc: getValue('DokMiejsc'),
OpiekunRoboty: getValue('OpiekunRoboty'),
DataRozpoczecia: getValue('DataRozpoczecia'),
DataPlanZakonczenia: getValue('DataPlanZakonczenia'),
UserData: {
Dane_dod1: getValue('UserData_Dane_dod1'),
Dane_dod2: getValue('UserData_Dane_dod2')
},
// Poniżej stałe wartości, które możesz dostosować w razie potrzeby
Wykonawca: "GEO", // Możesz to też pobierać z komórki
Zakonczona: false,
IdWykonawcy: 5,
IdZleceniodawcy: -1,
IdOsrodek: -1
// ... dodaj inne stałe lub puste pola, jeśli API ich wymaga
};
// Cały payload musi być tablicą zawierającą jeden obiekt
const finalPayload = [payloadObject];
const options = {
'method': 'post',
'contentType': 'application/json',
// Musimy przekonwertować obiekt JavaScript na tekst (string) w formacie JSON
'payload': JSON.stringify(finalPayload),
'muteHttpExceptions': true
};
try {
const confirmation = ui.alert(
'Potwierdzenie wysyłki JSON',
`Czy na pewno chcesz wysłać robotę o numerze "${numerRoboty}" do serwera?\n\nURL: ${serverUrl}`,
ui.ButtonSet.YES_NO
);
if (confirmation !== ui.Button.YES) {
ui.alert('Wysyłka anulowana.');
return;
}
const response = UrlFetchApp.fetch(serverUrl, options);
const responseCode = response.getResponseCode();
const responseBody = response.getContentText();
if (responseCode >= 200 && responseCode < 300) {
ui.alert('Sukces!', `Robota została pomyślnie wysłana (Kod: ${responseCode}).\nOdpowiedź serwera:\n${responseBody}`, ui.ButtonSet.OK);
} else {
ui.alert('Błąd serwera!', `Serwer odpowiedział kodem błędu: ${responseCode}\n\nOdpowiedź:\n${responseBody}`, ui.ButtonSet.OK);
}
} catch (e) {
ui.alert('Błąd Połączenia', `Nie można połączyć się z serwerem pod adresem:\n${serverUrl}\n\nUpewnij się, że serwer API jest uruchomiony i adres w skrypcie jest poprawny.\n\nSzczegóły błędu:\n${e.toString()}`, ui.ButtonSet.OK);
}
}Pozdrawiam Rafał Kocierz
Re: Geo Organizer -wklejanie tekstu
Umknął mi ten post, dziękuję! Pobawię się i jak będą coś się uda to podzielę się wynikami 
Strona główna softline
