Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 65600 Skopiuj do schowka Google Apps Script
Autor Wiadomość
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4483
Wysłany: 21-07-2019, 02:10   Google Apps Script

Znowu mam problem. ;-)

Czy ktoś z naszych ekspertów zna się dobrze na Google Apps Script?

Problem jest taki. Możemy tłumaczyć tekst korzystając ze strony https://translate.google.pl/. Możemy również korzystać z MSXML2.XMLHTTP - kody są i na naszym forum. Ale można przetłumaczyć za każdym razem tylko ~ 5 KB tekstu. Tymczasem ktoś tłumaczy np. 150 KB tekstu (dialogi filmu) za jednym zamachem. Właśnie za pomocą Google Apps Script. Dlatego chciałbym z tego korzystać.

Sprawa: https://script.google.com/home -> Nowy skrypt ->
kod.gs
Kod:

function doGet() {
   var html = HtmlService.createHtmlOutputFromFile('index')
        .setSandboxMode(HtmlService.SandboxMode.IFRAME)
        .setTitle('Translate Text')
        .setWidth(300);
   return html;
}

// Translate function.

function translate(source, sourceLangage, targetLangage) {
  var textTranslation = LanguageApp.translate(source.value, sourceLangage, targetLangage);
  source.value = textTranslation;
}


-> Plik -> Nowy -> Plik HTML -> wprowadzam nazwę index -> OK ->
Kod index.html
Kod:

<!doctype html>
<html>
<head>
     <meta charset="utf-8">
     <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
     <style type="text/css">
        body {
          color: white;
        }
        .top-logo {margin-bottom:50px;}
     </style>
     <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-74685517-1', 'auto');
        ga('send', 'pageview');
     </script>
</head>
<body bgcolor="#1E824C">
<center>
     <!-- Body -->
     <div>
          <textarea style="font-size: 12pt; font-family: Arial; width: 600px; height: 200px" id="textfield"></textarea>
     </div>
     <div class="inline form-group" align="left">
          <label for="sourceLanguage"><b>Source</b> Language</label>
          <select id="sourceLanguage">
               <option value="" selected>Auto detect</option>
               <option value="en">English</option>
               <option value="pl">Polish</option>
          </select>
     </div>
     
     <div class="inline form-group">
          <label for="targetLanguage"><b>Target</b> Language</label>
          <select id="targetLanguage">
               <option value="en">English</option>
               <option value="pl">Polish</option>
          </select>
     </div>

     <div style="margin: 10px 0px 10px 0px;">
         <button class="action" style="width:200px;height:40px" onclick="return google.script.run.translate(textfield, sourceLanguage.options[sourceLanguage.selectedIndex].value, targetLanguage.options[targetLanguage.selectedIndex].value);">Translate</button>
     </div>
</center>
</body>
</html>


-> Plik -> Zapisz wszystkie -> Opublikuj -> Wdróż jako aplikację internetową -> ... > zapisuję adress aplikacji. -> wklejam adres w przeglądarce -> wprowadzam tekst "I love you" -> wybieram English i Polish -> klikam "Translate" i nic się nie dzieje.

Zamierzenie jest takie: po wpisaniu adresu w przeglądarce funkcja doGet jest wykonywana, wskutek czego wyświetla stronę z TEXTAREA, 2 OPTIONS, i BUTTON. Kliknięcie Button wywołuje funkcję translate - google.script.run.translate. Dostarczam obiekt TEXTAREA, kod source i kod target. Tekst przetłumaczony ładuję z powrotem do TEXTAREA.

Funkcja translate powinna być wykonywana. LanguageApp.translate powinna zwrócić tekst textTranslation. Nie wiem, czy można przekazać obiekt do funkcji translate, i czy linia
Kod:

source.value = textTranslation;

jest poprawna. Kod jest po stronie server a TEXTAREA po stronie client.


Pytanie: co jest nie tak?
ID posta: 371101 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4483
Wysłany: 21-07-2019, 18:08   

Już rozwiązałem problem. Zamiast przekazać obiekt TEXTAREA to po prostu przekazuję TEXTAREA.value. Zwrócony przetłumaczony tekst ładuję, po stronie client, do TEXTAREA.
ID posta: 371108 Skopiuj do schowka
 
 
Kaper 



Zaproszone osoby: 2
Wersja: Win Office 365
Pomógł: 4191 razy
Posty: 7818
Wysłany: 22-07-2019, 08:54   

Dzięki za podzielenie się wskazówką. Ja prawie wcale nie korzystam, ale znam kilka osób, które korzystają, i mam nadzieję, że w razie wyszukiwania trafią tutaj (nasze forum jest nieźle pozycjonowane, w odróżnieniu od np. excelforum.com, gdzie wyszukiwane są tematy tytlko spred kilku lat, a najnowsze - wcale :-( .
_________________
Kaper Jej Królewskiej Mości :boss

Jeśli dane będą torturowane dość długo, przyznają się do wszystkiego
ID posta: 371123 Skopiuj do schowka
 
 
apollo
ExcelSpec


Pomógł: 1295 razy
Posty: 4483
Wysłany: 22-07-2019, 11:27   

Kaper napisał/a:
Dzięki za podzielenie się wskazówką.

Tak jest, Kaper
Na początku zmieniłem
Kod:

onclick="return google.script.run.translate(textfield, ...

na
Kod:

onclick="doTranslate();"

i dopiero w funkcji doTranslate coś takiego
Kod:

var text = google.script.run.translate(textfield.value, ...
textfield.value = text

----------
A w tej chwili mam dużo więcej. Wszelkie uwagi, ulepszenia są pożądane.

Co do wywołania Translate to oczywiście trzeba używać klasy google.script.run, żeby wywołać funkcje w code.gs z client. Ale dodane są withSuccessHandler, withFailureHandler i withUserObject.
Kod:

<button class="action" style="width:200px;height:40px"
             onclick="google.script.run
               .withSuccessHandler(updateTextArea)
               .withFailureHandler(onFailure)
               .withUserObject(targettextfield)
               .translate(sourcetextfield.value, sourceLanguage.options[sourceLanguage.selectedIndex].value, targetLanguage.options[targetLanguage.selectedIndex].value);">Translate</button>


Sens jest taki:
- Jeśli wykonanie .translate zakończy się sukcesem to wywołana jest funkcja updateTextArea z 2 parametrami: withSuccessHandler podstawia wartość zwracaną przez .translate w miejscu pierwszego parametru, a w miejscu drugiego podstawia obiekt podany z withUserObject, oczywiście jeśli w kodzie jest .wthUserObject(...)
- Jeśli wykonanie .translate zakończy się fiaskiem to wywołana jest funkcja onFailure z 1 parametrem - obiekt error.

Czyli wywołujemy translate ale z obsługą 2 sytuacji - sukces i fiasko.

Podaję całość:

index.html
Kod:

<!doctype html>
<html>
<head>
     <meta charset="utf-8">
     <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
     <style type="text/css">
        body {
          color: white;
        }
     </style>   
</head>
<body>
<center>
     <!-- Body -->
     <div>
       <input type="file" id="upload" accept=".txt, .doc, .docx, .srt" onchange="doUpload(this);"/>
     </div>
     <label for="sourcetextfield" style="color: black"><b>Source text</b></label>
     <div>
          <textarea style="font-size: 12pt; font-family: Arial; width: 600px; height: 200px; border:solid 1px blue" id="sourcetextfield"></textarea>
     </div>
     <br>
     <label for="sourcetextfield" style="color: black"><b>Target text</b></label>
     <div>
          <textarea style="font-size: 12pt; font-family: Arial; width: 600px; height: 200px; border:solid 1px blue" id="targettextfield"></textarea>
     </div>
     <div class="inline form-group" align="left">
          <label for="sourceLanguage" style="color: black"><b>Source</b> Language</label>
          <select id="sourceLanguage" style="border:solid 1px blue">
               <option value="pl">Polish</option>
               <option value="en">English</option>
          </select>
     </div>
     
     <div class="inline form-group">
          <label for="targetLanguage" style="color: black"><b>Target</b> Language</label>
          <select id="targetLanguage" style="border:solid 1px blue">
               <option value="en">English</option>
               <option value="pl">Polish</option>               
          </select>
     </div>

     <div style="margin: 10px 0px 10px 0px;">
         <button class="action" style="width:200px;height:40px"
             onclick="google.script.run
               .withSuccessHandler(updateTextArea)
               .withFailureHandler(onFailure)
               .withUserObject(targettextfield)
               .translate(sourcetextfield.value, sourceLanguage.options[sourceLanguage.selectedIndex].value, targetLanguage.options[targetLanguage.selectedIndex].value);">Translate</button>
     </div>
</center>
</body>
     <script type="text/javascript">
       function updateTextArea(text, t) {
         t.value = text;
       }
       function onFailure(error) {
        alert(error.message);
       }
     </script>
<script type="text/javascript">

function doUpload(uploader) {
   var reader = new FileReader();
   reader.readAsText(uploader.files[0], 'UTF-8');
   reader.onprogress = function(evt) {
      console.log('Progress of loading', evt);
   };
   reader.onload = function(evt) {
      document.getElementById('sourcetextfield').value = evt.target.result;
   };
   reader.onerror = function(evt) {
      alert('Error read file!');
   };
}
</script>
</html>


code.gs
Kod:

function doGet() {
   var html = HtmlService.createHtmlOutputFromFile('index')
        .setSandboxMode(HtmlService.SandboxMode.IFRAME);
   return html;
}

// Translate function.

function translate(sourceText, sourceLangage, targetLangage) {
  var textTranslation = LanguageApp.translate(sourceText, sourceLangage, targetLangage);
  return textTranslation;
}
ID posta: 371136 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe