Google elementide loomine

0. Translate

Tsükli sees kasutatakse konstantse getRange() asemel funktsioone getValues() ja setValues().
Kood toetab mitme rea korraga sisestamist.
Vähem tabelile juurdepääsu → kiirem täitmine.


Lisatud tõlked:
et — eesti keel
fr — prantsuse keel
ja — jaapani keel
lv — läti keel

function onEdit(e) {
  // Kontrollime, et sündmus eksisteerib
  if (!e || !e.range) return;

  const sheet = e.range.getSheet();

  // Töötame ainult lehel "synavara"
  if (sheet.getName() !== "synavara") return;

  const startRow = e.range.getRow();
  const numRows = e.range.getNumRows();
  const column = e.range.getColumn();

  // Töötame ainult A veeruga
  if (column !== 1) return;

  // Loeme kõik muudetud väärtused korraga
  const values = sheet
    .getRange(startRow, 1, numRows, 1)
    .getValues();

  // Massiivid tõlgete jaoks
  const etResults = [];
  const frResults = [];
  const jaResults = [];
  const lvResults = [];

  // Töötleme read
  for (let i = 0; i < values.length; i++) {

    const text = values[i][0];

    // Kui lahter on tühi
    if (!text) {
      etResults.push([""]);
      frResults.push([""]);
      jaResults.push([""]);
      lvResults.push([""]);
      continue;
    }

    // Tõlked erinevatesse keeltesse
    const et = LanguageApp.translate(text, 'en', 'et');
    const fr = LanguageApp.translate(text, 'en', 'fr');
    const ja = LanguageApp.translate(text, 'en', 'ja');
    const lv = LanguageApp.translate(text, 'en', 'lv');

    // Lisame tulemused massiividesse
    etResults.push([et]);
    frResults.push([fr]);
    jaResults.push([ja]);
    lvResults.push([lv]);
  }

  // Kirjutame kõik tulemused korraga
  // B = eesti
  sheet.getRange(startRow, 2, numRows, 1).setValues(etResults);

  // C = prantsuse
  sheet.getRange(startRow, 3, numRows, 1).setValues(frResults);

  // D = jaapani
  sheet.getRange(startRow, 4, numRows, 1).setValues(jaResults);

  // E = läti
  sheet.getRange(startRow, 5, numRows, 1).setValues(lvResults);
}

1. DriveApp

See kood loob Google Drive’i kausta, kuid erinevalt algsest versioonist küsib see kõigepealt kasutajalt nime, kontrollib seda tühjuse ja duplikaatide suhtes, kuvab vea- või eduteateid, kirjutab kausta lingi Google Sheetsi ja logib protsessi, samas kui algne kood loob lihtsalt fikseeritud nimega kausta ja väljastab selle nime logisse ilma igasuguste kontrollide või kasutaja sekkumiseta.

function createFolderImproved() {
  // Loome ühenduse Google Sheetsi kasutajaliidesega (UI)
  const ui = SpreadsheetApp.getUi();
  
  // 1. KÜSIME KASUTAJALT SISENDIT
  // Kuvatakse dialoogiaken, kus kasutaja saab sisestada kausta nime
  const response = ui.prompt('Kausta loomine', 'Sisesta uue kausta nimi:', ui.ButtonSet.OK_CANCEL);
  
  // Kontrollime, kas kasutaja vajutas "OK" nuppu
  if (response.getSelectedButton() == ui.Button.OK) {
    const folderName = response.getResponseText();
    
    // Kontrollime, et nimi ei oleks tühi
    if (!folderName || folderName.trim() === "") {
      ui.alert('Viga: Kausta nimi ei tohi olla tühi!');
      return;
    }

    // 2. KONTROLLIME DUPLIKAATE
    // Otsime Drive'ist kaustu, millel on juba sama nimi
    const existingFolders = DriveApp.getFoldersByName(folderName);
    
    if (existingFolders.hasNext()) {
      // Kui selline kaust on juba olemas, teavitame kasutajat ja katkestame töö
      ui.alert('Viga: Kaust nimega "' + folderName + '" on juba olemas!');
    } else {
      
      // 3. LOOME KAUSTA
      // Kui nimi on unikaalne, loome uue kausta Google Drive'i juurkataloogi
      const newFolder = DriveApp.createFolder(folderName);
      const folderUrl = newFolder.getUrl(); // Saame loodud kausta otselingi
      
      // 4. TAGASISIDE KASUTAJALE
      // Teavitame kasutajat edukast loomisest ja näitame linki
      ui.alert('Edu! Kaust "' + folderName + '" on loodud.\nLink: ' + folderUrl);
      
      // 5. ANDMETE SALVESTAMINE TABELISSE
      // Kirjutame loodud kausta lingi aktiivsesse lahtrisse, et seda oleks mugav avada
      SpreadsheetApp.getActiveRange().setValue(folderUrl);
      
      // Logime tegevuse ka skripti konsooli
      Logger.log("Loodi uus kaust: " + folderName + " asukohaga " + folderUrl);
    }
  } else {
    // Kui kasutaja vajutas "Cancel" või pani akna kinni
    Logger.log("Kasutaja tühistas kausta loomise.");
  }
}

2. CalendarApp

See täiustatud kood loob Google Calendaris sündmuse, kuid erinevalt lihtsast versioonist ei tee see kõike automaatselt, vaid suhtleb kasutajaga: küsib nime, kuupäeva ja kellaaega, kontrollib sisestatud andmete õigsust, välistab duplikaatsündmused, määrab kestuseks 1 tunni, lisab kirjelduse ja asukoha, kuvab tulemuse Google Sheetsis, muudab lahtri värvi ja kirjutab logisid, samas kui lihtne kood loob lihtsalt fikseeritud “Koosoleki” sündmuse praeguse kellaaja jaoks ilma kontrollide, sisendi või täiendava töötlemiseta.

function createCalendarEventImproved() {

  // Loome ühenduse Google Sheetsi kasutajaliidesega
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME SÜNDMUSE NIME
  const titleResponse = ui.prompt(
    'Kalendri sündmus',
    'Sisesta sündmuse nimi:',
    ui.ButtonSet.OK_CANCEL
  );

  // Kontrollime, kas kasutaja vajutas OK
  if (titleResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas tegevuse.");
    return;
  }

  const eventTitle = titleResponse.getResponseText();

  // Kontrollime, et nimi ei oleks tühi
  if (!eventTitle || eventTitle.trim() === "") {
    ui.alert("Viga: Sündmuse nimi ei tohi olla tühi!");
    return;
  }

  // 2. KÜSIME KUUPÄEVA
  const dateResponse = ui.prompt(
    'Kuupäev',
    'Sisesta kuupäev kujul YYYY-MM-DD:',
    ui.ButtonSet.OK_CANCEL
  );

  if (dateResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas tegevuse.");
    return;
  }

  const dateText = dateResponse.getResponseText();

  // 3. KÜSIME KELLAEGA
  const timeResponse = ui.prompt(
    'Kellaaeg',
    'Sisesta algusaeg kujul HH:MM:',
    ui.ButtonSet.OK_CANCEL
  );

  if (timeResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas tegevuse.");
    return;
  }

  const timeText = timeResponse.getResponseText();

  try {

    // Loome kuupäeva objekti
    const startDate = new Date(dateText + "T" + timeText + ":00");

    // Kontrollime kuupäeva korrektsust
    if (isNaN(startDate.getTime())) {
      ui.alert("Viga: Vale kuupäev või kellaaeg!");
      return;
    }

    // Sündmus kestab 1 tund
    const endDate = new Date(startDate.getTime() + 60 * 60 * 1000);

    // Avame vaikimisi kalendri
    const calendar = CalendarApp.getDefaultCalendar();

    // Kontrollime dubleerivaid sündmusi
    const events = calendar.getEvents(startDate, endDate);

    for (let i = 0; i < events.length; i++) {

      if (events[i].getTitle() === eventTitle) {

        ui.alert('Viga: Sama nimega sündmus on juba olemas!');
        return;
      }
    }

    // 4. LOOME SÜNDMUSE
    const newEvent = calendar.createEvent(
      eventTitle,
      startDate,
      endDate,
      {
        description: "Google Apps Script abil loodud sündmus",
        location: "Tallinn"
      }
    );

    // Saame sündmuse lingi
    const eventId = newEvent.getId();

    // 5. TAGASISIDE KASUTAJALE
    ui.alert(
      'Edu! Sündmus "' +
      eventTitle +
      '" on loodud.'
    );

    // 6. SALVESTAME INFO TABELISSE
    SpreadsheetApp.getActiveRange()
      .setValue(
        "Sündmus loodud: " +
        eventTitle +
        " | " +
        dateText +
        " " +
        timeText
      );

    // Muudame lahtri tausta
    SpreadsheetApp.getActiveRange()
      .setBackground("lightgreen");

    // Logime tegevuse
    Logger.log(
      "Loodi sündmus: " +
      eventTitle +
      " ID: " +
      eventId
    );

  } catch (error) {

    // Vigade töötlemine
    ui.alert("Tekkis viga: " + error);

    Logger.log(error);
  }
}

3. DocumentApp

Olen täiustanud Google DocumentAppi loomise koodi, lisades kasutaja sisestatud pealkirja ja teksti, kontrollides tühjade väärtuste olemasolu, veakäsitlust (try/catch), lisades automaatselt vaiketeksti, salvestades lingi Google Sheetsi ja esile tõstes tulemuse, muutes skripti interaktiivsemaks, töökindlamaks ja kasutajasõbralikumaks võrreldes põhiversiooniga, mis lihtsalt loob dokumendi fikseeritud tekstiga.

function createDocumentImproved() {

  // Loome ühenduse Google Sheetsi kasutajaliidesega
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME DOKUMENDI NIME
  const nameResponse = ui.prompt(
    'Dokumendi loomine',
    'Sisesta dokumendi nimi:',
    ui.ButtonSet.OK_CANCEL
  );

  if (nameResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas tegevuse.");
    return;
  }

  const docName = nameResponse.getResponseText();

  // Kontrollime, et nimi ei oleks tühi
  if (!docName || docName.trim() === "") {
    ui.alert("Viga: Dokumendi nimi ei tohi olla tühi!");
    return;
  }

  // 2. KÜSIME SISU
  const textResponse = ui.prompt(
    'Dokumendi sisu',
    'Sisesta teksti sisu:',
    ui.ButtonSet.OK_CANCEL
  );

  if (textResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas tegevuse.");
    return;
  }

  const content = textResponse.getResponseText();

  try {

    // 3. LOOME DOKUMENDI
    const doc = DocumentApp.create(docName);
    const body = doc.getBody();

    // Kontrollime, kas sisu on tühi
    if (!content || content.trim() === "") {
      body.appendParagraph("Vaikimisi tekst: Tere, maailm!");
    } else {
      body.appendParagraph(content);
    }

    // 4. LISAME LISATEKSTI
    body.appendParagraph("— loodud Google Apps Script abil");

    // 5. TAGASISIDE
    const url = doc.getUrl();

    ui.alert("Edu! Dokument loodud.\nLink: " + url);

    // 6. SALVESTAME TABELISSE
    SpreadsheetApp.getActiveRange()
      .setValue(docName + " | " + url)
      .setBackground("lightgreen");

    // LOGIMINE
    Logger.log("Dokument loodud: " + docName + " | " + url);

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

4. SpreadsheetApp

Olen täiustanud Google Sheetsi (SpreadsheetAppi) kogemust, lisades lehe nime sisestamise, tühjade väärtuste ja duplikaatide kontrollimise, veatöötluse, uue lehe automaatse loomise algse teksti ja visuaalse kujundusega ning kasutajate logimise ja teavitused, muutes koodi turvalisemaks, interaktiivsemaks ja kasutatavamaks kui põhiversioon, mis lihtsalt loob lehe ilma igasuguste kontrollide või liideseta.

function addSheetImproved() {

  // Loome ühenduse Google Sheetsi kasutajaliidesega
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME LEHE NIME
  const response = ui.prompt(
    'Lehe loomine',
    'Sisesta uue lehe nimi:',
    ui.ButtonSet.OK_CANCEL
  );

  // Kui kasutaja katkestab
  if (response.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas tegevuse.");
    return;
  }

  const sheetName = response.getResponseText();

  // Kontrollime tühjust
  if (!sheetName || sheetName.trim() === "") {
    ui.alert("Viga: Lehe nimi ei tohi olla tühi!");
    return;
  }

  try {

    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // 2. KONTROLLIME, KAS LEHT ON JUBA OLEMAS
    const existingSheet = spreadsheet.getSheetByName(sheetName);

    if (existingSheet) {
      ui.alert("Viga: Leht nimega '" + sheetName + "' on juba olemas!");
      return;
    }

    // 3. LOOME UUE LEHE
    const newSheet = spreadsheet.insertSheet(sheetName);

    // 4. LISAME ALGANDMED
    newSheet.getRange("A1").setValue("Tere! See on uus leht.");
    newSheet.getRange("A1").setBackground("lightgreen");

    // 5. TAGASISIDE
    ui.alert("Edu! Leht '" + sheetName + "' on loodud.");

    // LOGIMINE
    Logger.log("Leht loodud: " + sheetName);

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

5. FormsApp

Täiustasin Google Formsi (FormAppi) kogemust, lisades vormi nime sisestamise, nullvalideerimise, veakäsitluse, automaatse vormi loomise mitme küsimusetüübiga (valikvastustega, teksti- ja märkeruutudega) ning väljastades lingi vormi muutmiseks ja logimiseks, muutes koodi paindlikumaks, interaktiivsemaks ja võimsamaks võrreldes põhiversiooniga, mis lihtsalt loob vormi ja lisab ühe küsimuse ilma igasuguse valideerimise või kasutaja sisendita.

function createFormImproved() {

  // Loome ühenduse kasutajaliidesega
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME VORMI NIME
  const response = ui.prompt(
    'Vormi loomine',
    'Sisesta vormi nimi:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const formTitle = response.getResponseText();

  // Kontroll tühja nime jaoks
  if (!formTitle || formTitle.trim() === "") {
    ui.alert("Viga: vormi nimi ei tohi olla tühi!");
    return;
  }

  try {

    // 2. LOOME VORMI
    const form = FormApp.create(formTitle);

    // 3. LISAME KÜSIMUSED

    const mcItem = form.addMultipleChoiceItem();
    mcItem.setTitle("Kas sulle meeldib programmeerimine?")
      .setChoiceValues(["Jah", "Ei"]);

    const textItem = form.addTextItem();
    textItem.setTitle("Mis on sinu lemmik programmeerimiskeel?");

    const checkboxItem = form.addCheckboxItem();
    checkboxItem.setTitle("Milliseid tegevusi sa armastad?")
      .setChoiceValues(["Koodimine", "Lugemine", "Jooksmine", "Muusika kuulamine"]);

    // 4. TAGASISIDE
    const url = form.getEditUrl();

    ui.alert("Edu! Vorm loodud.\nLink: " + url);

    // 5. LOGIMINE
    Logger.log("Vorm loodud: " + formTitle);

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

6. PropertiesService

Täiustasin PropertiesService’i, lisades kasutaja sisendi, nullkontrolli, mitme parameetri (kasutajanimi ja salvestusaeg) salvestamise, salvestatud andmete lugemise valideerimiseks, veakäsitlust ja kasutajaliidese teavitusi, muutes skripti praktilisemaks ja kasulikumaks kasutajasätete salvestamiseks võrreldes põhiversiooniga, mis lihtsalt salvestab ühe fikseeritud muutuja ilma kasutaja sekkumiseta.

function propertiesServiceImproved() {

  // Loome kasutajaliidese
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME KASUTAJALT NIME
  const response = ui.prompt(
    'Seadete salvestamine',
    'Sisesta kasutajanimi:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const username = response.getResponseText();

  // Kontrollime tühjust
  if (!username || username.trim() === "") {
    ui.alert("Viga: kasutajanimi ei tohi olla tühi!");
    return;
  }

  try {

    // 2. SAAME USER PROPERTIES
    const userProperties = PropertiesService.getUserProperties();

    // 3. SALVESTAME ANDMED
    userProperties.setProperty("username", username);
    userProperties.setProperty("lastSaved", new Date().toString());

    // 4. LOEME ANDMED TAGASI (kontrolliks)
    const savedName = userProperties.getProperty("username");

    // 5. TAGASISIDE
    ui.alert("Edu! Salvestatud kasutaja: " + savedName);

    // 6. LOGIMINE
    Logger.log("Atribuut salvestatud: " + savedName);

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

7. UrlFetchApp

Olen UrlFetchAppi kogemust täiustanud, lisades API URL-i sisestamise, URL-i valideerimise, HTTP veatöötluse (vastusekoodi), turvalise JSON-i parsimise, Google Sheetsi väljundi, kasutajaliidese teavitused ja try/catch erandite käsitlemise, muutes skripti võrreldes põhiversiooniga, mis lihtsalt esitab päringu ilma igasuguse valideerimise või kasutaja sisendita, töökindlamaks ja valmisolekuks väliste API-dega töötamiseks.

function fetchDataImproved() {

  // Loome kasutajaliidese
  const ui = SpreadsheetApp.getUi();

  // 1. API URL (võib ka kasutajalt küsida)
  const response = ui.prompt(
    'Andmete laadimine',
    'Sisesta API URL:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const url = response.getResponseText();

  // Kontrollime, et URL ei oleks tühi
  if (!url || url.trim() === "") {
    ui.alert("Viga: URL ei tohi olla tühi!");
    return;
  }

  try {

    // 2. HTTP päring
    const apiResponse = UrlFetchApp.fetch(url, {
      method: "get",
      muteHttpExceptions: true
    });

    const code = apiResponse.getResponseCode();

    // 3. Kontrollime vastust
    if (code !== 200) {
      ui.alert("Viga: server tagastas koodi " + code);
      return;
    }

    // 4. PARSEIME ANDMED
    const data = JSON.parse(apiResponse.getContentText());

    // 5. KUVAME TULEMUSE TABELIS
    SpreadsheetApp.getActiveSheet()
      .getRange("A1")
      .setValue(JSON.stringify(data));

    // 6. TAGASISIDE
    ui.alert("Edu! Andmed on laaditud.");

    // LOGIMINE
    Logger.log("Andmed edukalt saadud URL-ist: " + url);

  } catch (error) {

    ui.alert("Viga andmete laadimisel: " + error);
    Logger.log(error);
  }
}

8. Utilities

Olen utiliidi kogemust täiustanud, lisades kasutaja sisendi, Base64 kodeeringu ja dekodeerimise, juhuslike arvude genereerimise, praeguse kellaaja vormindamise, kõigi tulemuste väljastamise Google Sheetsi, veatöötluse ja kasutajaliidese teavitused. See muudab skripti funktsionaalsemaks ja demonstreerib korraga mitut utiliidifunktsiooni, mitte ainult stringikodeeringut.

function utilitiesImproved() {

  // Loome kasutajaliidese
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME TEKSTI
  const response = ui.prompt(
    'Teksti kodeerimine',
    'Sisesta tekst Base64 kodeerimiseks:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const text = response.getResponseText();

  // Kontroll tühja väärtuse jaoks
  if (!text || text.trim() === "") {
    ui.alert("Viga: tekst ei tohi olla tühi!");
    return;
  }

  try {

    // 2. KODEERIMINE
    const encoded = Utilities.base64Encode(text);

    // 3. DEKODEERIMINE (kontrolliks)
    const decoded = Utilities.base64Decode(encoded);
    const decodedText = Utilities.newBlob(decoded).getDataAsString();

    // 4. JUHUSLIK NUMBER
    const randomNumber = Math.floor(Math.random() * 1000);

    // 5. AJA FORMAT
    const formattedTime = Utilities.formatDate(
      new Date(),
      Session.getScriptTimeZone(),
      "yyyy-MM-dd HH:mm:ss"
    );

    // 6. KUVAME TULEMUSE
    const result =
      "Encoded: " + encoded + "\n" +
      "Decoded: " + decodedText + "\n" +
      "Random: " + randomNumber + "\n" +
      "Time: " + formattedTime;

    SpreadsheetApp.getActiveSheet()
      .getRange("A1")
      .setValue(result);

    // 7. TAGASISIDE
    ui.alert("Edu! Andmed töödeldud.");

    // LOGIMINE
    Logger.log(result);

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

9. HtmlService

Täiustasin HtmlService’i kogemust, lisades kohandatud HTML-akna sisestusvälja ja nupuga, kliendipoolse JavaScripti andmete valideerimise, andmete edastamise Apps Scripti google.script.runi kaudu, serveripoolse tekstitöötluse ja salvestamise Google Sheetsi ning eduteatised, muutes skripti lihtsa staatilise tekstiga dialoogi asemel täisväärtuslikuks kasutajaliideseks.

function showDialogImproved() {

  // 1. LOOME HTML LIIDESE
  const html = HtmlService.createHtmlOutput(`
    <div style="font-family: Arial; padding: 10px;">
      <h3>Andmete sisestamine</h3>

      <input type="text" id="inputText" placeholder="Sisesta tekst" style="width:100%; padding:5px;" />

      <br><br>

      <button onclick="sendData()">Saada</button>

      <script>
        function sendData() {
          const text = document.getElementById('inputText').value;

          if (!text) {
            alert('Tekst ei tohi olla tühi!');
            return;
          }

          google.script.run
            .withSuccessHandler(function() {
              alert('Edu! Andmed saadetud.');
            })
            .saveFromDialog(text);
        }
      </script>
    </div>
  `).setWidth(300).setHeight(200);

  // 2. AVAME DIALOOGI
  SpreadsheetApp.getUi().showModalDialog(html, "HTML Dialoog");
}

// 3. ANDMETE SALVESTAMINE (serveripoolne funktsioon)
function saveFromDialog(text) {

  if (!text || text.trim() === "") {
    Logger.log("Tühi sisend!");
    return;
  }

  SpreadsheetApp.getActiveSheet()
    .getRange("A1")
    .setValue(text);

  Logger.log("Salvestatud tekst: " + text);
}

10. ContactsApp

Olen täiustanud ContactsAppi kogemust, lisades kasutaja sisestatava eesnime, perekonnanime ja e-posti aadressi, kontrollides tühjade väärtuste ja e-posti aadressi kehtivust, kaitsedes duplikaatkontaktide eest, pakkudes veakäsitlust try/catch funktsiooni abil, väljundit Google Sheetsi ja kasutajaliidese teavitusi, muutes skripti turvalisemaks, interaktiivsemaks ja kasutajasõbralikumaks kui põhiversioon, mis lihtsalt loob fikseeritud andmetega kontakti ilma igasuguste kontrollide või kasutaja sekkumiseta.

function createContactImproved() {

  // Loome kasutajaliidese
  const ui = SpreadsheetApp.getUi();

  // 1. KÜSIME EESNIME
  const firstNameResponse = ui.prompt(
    'Kontakti loomine',
    'Sisesta eesnimi:',
    ui.ButtonSet.OK_CANCEL
  );

  if (firstNameResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const firstName = firstNameResponse.getResponseText();

  // Kontrollime tühjust
  if (!firstName || firstName.trim() === "") {
    ui.alert("Viga: eesnimi ei tohi olla tühi!");
    return;
  }

  // 2. KÜSIME PEREKONNANIME
  const lastNameResponse = ui.prompt(
    'Kontakti loomine',
    'Sisesta perekonnanimi:',
    ui.ButtonSet.OK_CANCEL
  );

  if (lastNameResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const lastName = lastNameResponse.getResponseText();

  // 3. KÜSIME EMAILI
  const emailResponse = ui.prompt(
    'Kontakti loomine',
    'Sisesta email:',
    ui.ButtonSet.OK_CANCEL
  );

  if (emailResponse.getSelectedButton() != ui.Button.OK) {
    Logger.log("Kasutaja katkestas.");
    return;
  }

  const email = emailResponse.getResponseText();

  // Kontrollime emaili
  if (!email || !email.includes("@")) {
    ui.alert("Viga: vale email!");
    return;
  }

  try {

    // 4. KONTROLLIME DUPLIKAATE
    const existingContacts = ContactsApp.getContactsByEmailAddress(email);

    if (existingContacts.length > 0) {
      ui.alert("Viga: kontakt selle emailiga juba eksisteerib!");
      return;
    }

    // 5. LOOME KONTAKTI
    const contact = ContactsApp.createContact(
      firstName,
      lastName,
      email
    );

    // 6. TAGASISIDE
    ui.alert(
      "Edu! Kontakt loodud: " +
      contact.getFullName()
    );

    // 7. SALVESTAME TABELISSE
    SpreadsheetApp.getActiveSheet()
      .getRange("A1")
      .setValue(
        contact.getFullName() +
        " | " +
        email
      )
      .setBackground("lightgreen");

    // LOGIMINE
    Logger.log(
      "Kontakt loodud: " +
      contact.getFullName()
    );

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

11. Session

Parandasin seansikogemust, lisades võimaluse hankida mitu praeguse kasutaja seansi parameetrit (e-post, liidese keel ja ajavöönd), veakäsitlust, teabe väljastamist kasutajaliidese kaudu, tulemuse salvestamist Google Sheetsi ja visuaalset disaini. See muudab skripti informatiivsemaks ja kasutajasõbralikumaks võrreldes põhiversiooniga, mis lihtsalt väljastab kasutaja e-posti aadressi logisse.

function getUserSessionImproved() {

  // Loome kasutajaliidese
  const ui = SpreadsheetApp.getUi();

  try {

    // 1. SAAME KASUTAJA EMAILI
    const email = Session.getActiveUser().getEmail();

    // 2. SAAME KEELE
    const language = Session.getActiveUserLocale();

    // 3. SAAME AJAVÖÖNDI
    const timezone = Session.getScriptTimeZone();

    // Kontrollime, kas email on saadaval
    const finalEmail = email || "Email pole saadaval";

    // 4. KOOSTAME TULEMUSE
    const result =
      "Email: " + finalEmail + "\n" +
      "Keel: " + language + "\n" +
      "Ajavöönd: " + timezone;

    // 5. KUVAME TULEMUSE
    ui.alert(result);

    // 6. SALVESTAME TABELISSE
    SpreadsheetApp.getActiveSheet()
      .getRange("A1")
      .setValue(result)
      .setBackground("lightblue");

    // LOGIMINE
    Logger.log(result);

  } catch (error) {

    ui.alert("Viga: " + error);
    Logger.log(error);
  }
}

Projekti lõpus lõin kohandatud Google Sheetsi menüü, kasutades meetodeid onOpen() ja SpreadsheetApp.getUi(), ühendades kõik väljatöötatud tööriistad (Drive, Calendar, Docs, Forms, API, Utilities, Sessions ja muud) ühte mugavasse liidesesse, tänu millele muutus projekt täieõiguslikuks minirakenduseks Google Sheetsi sees, millel on kiire juurdepääs kõigile funktsioonidele.

function onOpen() {

  const ui = SpreadsheetApp.getUi();

  // PEAMENÜÜ
  ui.createMenu("H4.3 Tööriistad")

    // DRIVE
    .addSubMenu(
      ui.createMenu("Drive")
        .addItem("Loo kaust", "createFolderImproved")
    )

    // KALENDER
    .addSubMenu(
      ui.createMenu("Kalender")
        .addItem("Loo sündmus", "createCalendarEventImproved")
    )

    // DOCS
    .addSubMenu(
      ui.createMenu("Docs")
        .addItem("Loo dokument", "createDocumentImproved")
    )

    // SHEETS
    .addSubMenu(
      ui.createMenu("Sheets")
        .addItem("Lisa leht", "addSheetImproved")
    )

    // FORMS
    .addSubMenu(
      ui.createMenu("Forms")
        .addItem("Loo vorm", "createFormImproved")
    )

    // SEADED
    .addSubMenu(
      ui.createMenu("Seaded")
        .addItem("Salvesta seaded", "propertiesServiceImproved")
    )

    // API
    .addSubMenu(
      ui.createMenu("API")
        .addItem("Laadi API andmed", "fetchDataImproved")
    )

    // BASE64
    .addSubMenu(
      ui.createMenu("Base64")
        .addItem("Kodeeri tekst", "utilitiesImproved")
    )

    // HTML DIALOOG
    .addSeparator()
    .addItem("Projektiinfo dialoog", "showDialogImproved")

    // SESSION
    .addItem("Kasutaja e-post / seanss", "getUserSessionImproved")

    .addToUi();
}