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();
}