• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

google Form + google sheet

VPS Starter Arubacloud
0 głosów
217 wizyt
pytanie zadane 1 lipca w Rozwój zawodowy, nauka, praca przez Irek1974 Nowicjusz (160 p.)
czesc,

chciałbym zrobic googe Fomsa, do którego jedna osoba bedzie wpisywała dane np. :

- kontrahent
- kwota netto faktury
- rodzaj kosztu (i tu lista rozwijana : stałe, zmienne, inne)

czy jest możliwe zeby wpisane do FORMSA dane przerzucały się do trzech oddzielnych plików Googla (sheets) na podstawie tego co wybralem w "rodzaj kosztu" - tak żeby powstały trzy oddzielne pliki w ktorych beda tylko koszty z wybranego rodzaju ?
(wiem jak zrobić, żeby te dane - wszystkie dane - zrzucały się do jednego pliku. Ale potrzebuje, żeby zrzuciły sie do trzech oddzielnych

bardzo prosze o pomoc

4 odpowiedzi

+1 głos
odpowiedź 6 lipca przez VBService Ekspert (255,840 p.)
edycja 6 lipca przez VBService

W oparciu o wypowiedź @mattrattus, proponuje rozważenie takiego rozwiązania:

  1. Utwórz Google Form, dodaj pola: "kontrahent", "kwota netto faktury", "rodzaj kosztu" (lista rozwijana: stałe, zmienne, inne)
  2. W Google Form, kliknij na Odpowiedzi, a następnie kliknij ikonę arkusza, aby utworzyć nowy arkusz Google Sheets, który będzie zapisywał wszystkie odpowiedzi.
  3. Utwórz dodatkowo trzy kolejne, oddzielne pliki Google Sheets: jeden dla "stałe", drugi dla "zmienne", trzeci dla "inne". Zanotuj sobie ich identyfikatory id z url-a, ponieważ będą potrzebne w skrypcie.
  4. Otwórz Google Sheets, który jest linkowany do Google Form (patrz punkt 2), kliknij Extensions > Apps Script
    (w przykładzie wybrane JavaScript kolorowanie składni dla Google Apps Script)
     
    function onFormSubmit(e) {
      var sheet = e.source.getActiveSheet();
      var row = e.range.getRow();
      var kontrahent = sheet.getRange(row, 1).getValue();
      var kwota = sheet.getRange(row, 2).getValue();
      var rodzajKosztu = sheet.getRange(row, 3).getValue();
    
      var targetSheetId;
      if (rodzajKosztu == 'stałe') {
        targetSheetId = 'ID_SHEET_STAŁE';
      } else if (rodzajKosztu == 'zmienne') {
        targetSheetId = 'ID_SHEET_ZMIENNE';
      } else if (rodzajKosztu == 'inne') {
        targetSheetId = 'ID_SHEET_INNE';
      }
      /* lub
      switch (rodzajKosztu) {
        case 'stałe':
          targetSheetId = 'ID_SHEET_STAŁE';
          break;
        case 'zmienne':
          targetSheetId = 'ID_SHEET_ZMIENNE';
          break;
        case 'inne':
          targetSheetId = 'ID_SHEET_INNE';
          break;
        default:
          targetSheetId = null;
      }
      */
      /* lub
      var targets = {
        'stałe': 'ID_SHEET_STAŁE',
        'zmienne': 'ID_SHEET_ZMIENNE',
        'inne': 'ID_SHEET_INNE'
      };
      var targetSheetId = targets[rodzajKosztu.toLowerCase()] || null;
      */
    
      if (targetSheetId) {
        var targetSheet = SpreadsheetApp.openById(targetSheetId).getSheets()[0];
        targetSheet.appendRow([kontrahent, kwota]);
      }
    }
    
    function setupTrigger() {
      var formSheet = SpreadsheetApp.getActiveSpreadsheet();
      ScriptApp.newTrigger('onFormSubmit')
        .forSpreadsheet(formSheet)
        .onFormSubmit()
        .create();
    }
    
  5. Wstaw w kodzie powyżej odpowiednie id (Google Sheets - patrz punkt 3) zamiast tekstu ID_SHEET_STAŁE itd.

  6. Kliknij Run i wybierz setupTrigger aby utworzyć wyzwalacz. Ten wyzwalacz spowoduje, że skrypt onFormSubmit będzie uruchamiany za każdym razem, gdy zostanie przesłana nowa odpowiedź z Google Form.

0 głosów
odpowiedź 2 lipca przez coolxer Użytkownik (560 p.)

Pierwsze co wpadło mi do głowy to użycie jakiegoś automatyzatora typu Zapier, czy Make.

Istnieje jednak możliwość tworzenia tego typu automatyzacji bezpośrednio w środowisku Google, tzw. Google Apps Script [tutaj znalazłem jakiś poradnik (tworzymy 4 arkusze - jeden główny, a 3 pozostałe to arkusz per koszt i ten główny podpinamy do formularza, i na głównym arkuszu tworzymy skrypt).

Nie wiem z czego wynika konieczność dzielenia danych na kilka arkuszy, ale można też pomyśleć o zastosowaniu tylko jednego akrusza, ale z kilkoma kartami. Istnieje też opcja całkowitego braku podziału i używania filtrów po typie kosztu - co daje podobny efekt, ale to zależy ile tych danych jest, czy ktoś ma mieć dostęp do nich wszystkich oraz czy nie są poźniej jakoś automatycznie przetwarzane.

Nie jestem specem od tego typu zadań, musiałbym więcej poszukać i popróbować. Jeśli będziesz nadal zainteresowany i nie poradzisz sobie samodzielnie to jakoś się dogadamy i postaram się wtedy konkretniej pomóc, poświęcając więcej czasu. 

 

0 głosów
odpowiedź 4 lipca przez mattrattus Gaduła (4,100 p.)

Możesz to zrobić na dwa sposoby:
1. zewnętrznie np. z użyciem Zapiera
2. wew. z użycie App Script - w docelowych arkuszach tworzysz odpowiedni skrypt, który ma ustawiony trigger i to ten skyrpt w określonym czasie albo po odpowiednim zdarzeniu (w Twoim przypadku dodanie nowego wiersza w arkuszu powiązanym z formularzem) pobiera odpowiedni wiersz i wstawia.

Takie skrypt piszesz dla każdego z tych nowych arkuszy które mają pobierać dane.

Co prawda napisanie skryptu wymaga wiedzy, ale spokojnie całą masę poradników znajdziesz na YT albo ogólnie w necie.

Poniżej masz przygotowany na szybko - dla przykładu ze słowem stałe - który pojawi się w kolumnie C. Skrypt sprawdza arkusz co 5 minut. Musisz zmienić XXXX na ID arkusza powiązanego z formularzem.

function createTimeDrivenTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() === 'importNewRows') {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

  ScriptApp.newTrigger('importNewRows')
    .timeBased()
    .everyMinutes(5)
    .create();
}

function importNewRows() {
  var sourceSpreadsheetId = 'XXXX';
  var sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId);
  var sourceSheet = sourceSpreadsheet.getActiveSheet();
  
  var data = sourceSheet.getDataRange().getValues();
  
  var targetSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var targetSheet = targetSpreadsheet.getActiveSheet();
  var lastRow = targetSheet.getLastRow();
  
  for (var i = 0; i < data.length; i++) {
    if (data[i][2] === 'stałe' && i + 1 > lastRow) {
      targetSheet.appendRow(data[i]);
    }
  }
}

createTimeDrivenTrigger();

Powodzenia ;)

0 głosów
odpowiedź 25 września przez Irek1974 Nowicjusz (160 p.)
po pierwsze dziękuję za wcześniejsze podpowiedzi

po długich poszukiwaniach najlepszego rozwiazania użyłem Importrange

wszystko byłoby ok gdyby nie jednen mały szkopuł

jeden z plików (i ja jestem jego twórcą/właścicielem - nazwijmy go "baza") - zawiera zestawienie danych których potrzebuję do innych analiz. Tworzę sobie nowy plik i w tym nowym pliku wpisuję formułę "importrange" po to, żeby zrzucić te dane których potrzebuje do odpowiedniej analizy
I tu pojawia się problem - w odpowiedzi dostaję informację, że "nie masz dostępu do pliku"
jak to możliwe skoro to ja jestem twórcą tego pliku "baza"
help plis - jak to ogarnąć

Podobne pytania

0 głosów
1 odpowiedź 606 wizyt
0 głosów
0 odpowiedzi 140 wizyt
0 głosów
0 odpowiedzi 110 wizyt

93,020 zapytań

141,985 odpowiedzi

321,283 komentarzy

62,366 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...