Geo Organizer -wklejanie tekstu

aplikacja do zarządzania robotami geodezyjnymi
pomiar
_____
_____
Posty: 395
Rejestracja: 12 lip 2019, 17:43
Lokalizacja: Wadowice
Kontakt:

Geo Organizer -wklejanie tekstu

Post autor: pomiar »

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?
Awatar użytkownika
FaFaL
Team
Team
Posty: 3231
Rejestracja: 11 lip 2005, 14:09
Lokalizacja: Opole..Kraków
Kontakt:

Re: Geo Organizer -wklejanie tekstu

Post autor: FaFaL »

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ć :

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
pomiar
_____
_____
Posty: 395
Rejestracja: 12 lip 2019, 17:43
Lokalizacja: Wadowice
Kontakt:

Re: Geo Organizer -wklejanie tekstu

Post autor: pomiar »

Umknął mi ten post, dziękuję! Pobawię się i jak będą coś się uda to podzielę się wynikami :D
ODPOWIEDZ