HTML Hizmeti: Sunucu İşlevleri ile İletişim

google.script.run eşzamansız bir HTML hizmeti sayfalarının sunucu tarafında çağrı yapmasına olanak tanıyan istemci taraflı JavaScript API Apps Komut Dosyası işlevleri. Aşağıdaki örnekte, projenizin en temel işlevi / google.script.runsunucuda bir işlev çağırma JavaScript'ten Search Ads 360'a aktarılır.

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function doSomething() {
  Logger.log('I was called!');
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      google.script.run.doSomething();
    </script>
  </head>
</html>

Bu komut dosyasını bir web uygulaması olarak dağıtıp URL'sini ziyaret ederseniz içerir, ancak günlükleri görüntülerseniz sunucu işlevinin doSomething() arandı.

Sunucu tarafı işlevlere yapılan istemci tarafı çağrılar eşzamansızdır: tarayıcıdan sunucunun doSomething() işlevini çalıştırmasını istediğinde tarayıcı çalışmaya devam eder kodda hemen sonraki satıra geçer. Bunun anlamı şudur: işlevi çağrılarının beklediğiniz sırada yürütülmeyebileceğini bildirir. Bir iki fonksiyon çağrısını aynı anda çalıştırmazsanız, hangi işlevin koşmaya başlayın; sonuç, sayfayı her yükleyişinizde farklılık gösterebilir. Böyle bir durumda başarı işleyiciler ve başarısızlık işleyiciler kodunuzun akışını kontrol etmenize yardımcı olur.

google.script.run API, sunucu işlevlerine 10 eşzamanlı çağrıya izin verir. Eğer 10. çağrı devam ederken 11. çağrıyı yaparsanız sunucu işlevi 10 noktadan biri serbest bırakılana kadar ertelenir. Pratikte ise çok seyrek çoğu tarayıcı zaten sınırlı olduğundan, bu kısıtlamayı aynı sunucuya 10'dan küçük bir sayıda eşzamanlı gönderilen isteklerin sayısı. Örneğin, Firefox'ta bu sınır 6'dır. Çoğu tarayıcı da benzer şekilde aşırı miktarda gecikme sunucu isteklerinden biri mevcut isteklerden biri tamamlanana kadar bekletilir.

Parametreler ve döndürülen değerler

İstemciden gelen parametrelerle bir sunucu işlevini çağırabilirsiniz. Benzer şekilde, sunucu işlevi, istemcinin sunucuya bir başarı işleyiciyi inceleyin.

Yasal parametreler ve döndürülen değerler Number gibi temel JavaScript öğeleridir Boolean, String veya null öğelerinin yanı sıra ilkel öğelerden, nesnelerden ve dizilerden oluşur. Sayfa içinde bir form öğesi parametre olarak da geçerlidir, ancak işlevin tek parametresi olmalıdır ve değer döndürülmesi açısından yasal değildir. Bir Date, Function, form veya yasaklı başka bir türe ek olarak DOM öğesi, dahil olmak üzere izin verilmeyen türlerin kullanımını içerir. Oluşturulan nesneler döngüsel başvurular da başarısız olur ve dizilerdeki tanımlanmamış alanlar null

Sunucuya iletilen bir nesnenin, orijinalin bir kopyası haline geleceğini unutmayın. sunucu işlevi bir nesneyi alır ve özelliklerini değiştirir. müşteri bu durumdan etkilenmez.

Başarı işleyiciler

İstemci taraflı kod, sunucu beklemeden sonraki satıra devam ettiği için tamamlamak için withSuccessHandler(function) sunucu bir kullanıcı tarafından çalıştırıldığında çalıştırılacak bir istemci tarafı geri çağırma işlevi belirtmenize olanak tanır. yanıt verir. Sunucu işlevi bir değer döndürürse API, bu değeri parametre olarak yeni işleve dönelim.

Aşağıdaki örnekte, sunucu yanıt verdiğinde bir tarayıcı uyarısı gösterilmektedir. Not sunucu tarafı işlevi doğru olduğundan bu kod örneğine yönelik yetkilendirme oturum açın. Komut dosyasını yetkilendirmenin en basit yolu işlemi yapmadan önce komut dosyası düzenleyiciden getUnreadEmails() işlevini manuel olarak bir kez kullanın. sayfayı yükleyin. Alternatif olarak web uygulamasını dağıtarak "web uygulamasına erişen kullanıcı" olarak yürütmelidir. Bu durumda, ve uygulamayı yüklediğinizde yetkilendirme istenir.

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function getUnreadEmails() {
  return GmailApp.getInboxUnreadCount();
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function onSuccess(numUnread) {
        var div = document.getElementById('output');
        div.innerHTML = 'You have ' + numUnread
            + ' unread messages in your Gmail inbox.';
      }

      google.script.run.withSuccessHandler(onSuccess)
          .getUnreadEmails();
    </script>
  </head>
  <body>
    <div id="output"></div>
  </body>
</html>

Hata işleyiciler

Sunucunun yanıt vermemesi veya bir hata vermesi durumunda withFailureHandler(function) bir başarı işleyici yerine bir hata işleyici belirtmenize olanak tanır. Error nesne (varsa) bağımsız değişken olarak iletildi.

Varsayılan olarak, bir hata işleyici belirtmezseniz JavaScript konsolunu kullanarak Bunu geçersiz kılmak için withFailureHandler(null) numaralı telefonu arayın veya hata işleyici olabilir.

Hata işleyicilerin söz dizimi, başarılı işleyicilerin söz dizimiyle neredeyse aynıdır, çünkü yardımcı olur.

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function getUnreadEmails() {
  // 'got' instead of 'get' will throw an error.
  return GmailApp.gotInboxUnreadCount();
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function onFailure(error) {
        var div = document.getElementById('output');
        div.innerHTML = "ERROR: " + error.message;
      }

      google.script.run.withFailureHandler(onFailure)
          .getUnreadEmails();
    </script>
  </head>
  <body>
    <div id="output"></div>
  </body>
</html>

Kullanıcı nesneleri

Aynı başarılı veya başarısızlık işleyiciyi, aynı hedefe birden fazla çağrı için çağırarak sunucuya withUserObject(object) değerini kullanın. Bu “kullanıcı nesnesi”, User sınıfı — şuraya yanıt vermenize olanak tanır: istemcinin sunucuyla iletişim kurduğu bağlam. Kullanıcı nesneleri genellikle bunlar; işlevler, DOM öğeler, vb., parametrelere ve dönüş değerlerine ilişkin kısıtlamalar olmadan kullanır. Bununla birlikte, kullanıcı nesneleri new operatörü.

Bu örnekte, iki düğmeden birini tıkladığınızda o düğme değerini sunucudan alır ve diğer düğmeyi değiştirmeden bırakır, bir başarı işleyiciyi paylaşın. onclick işleyicisinde this anahtar kelimesi button'nin kendisi anlamına gelir.

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function getEmail() {
  return Session.getActiveUser().getEmail();
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function updateButton(email, button) {
        button.value = 'Clicked by ' + email;
      }
    </script>
  </head>
  <body>
    <input type="button" value="Not Clicked"
      onclick="google.script.run
          .withSuccessHandler(updateButton)
          .withUserObject(this)
          .getEmail()" />
    <input type="button" value="Not Clicked"
      onclick="google.script.run
          .withSuccessHandler(updateButton)
          .withUserObject(this)
          .getEmail()" />
  </body>
</html>

Formlar

Parametre olarak form öğesi içeren bir sunucu işlevini çağırırsanız form olarak alan adlarını anahtar, alan değerlerini değer olarak içeren tek bir nesne haline gelir. İlgili içeriği oluşturmak için kullanılan değerlerin tamamı dizelere dönüştürülür (file-input öğesinin içeriği hariç) Blob nesneleri haline gelirler.

Bu örnekte, dosya giriş alanı da dahil olmak üzere bir form yeniden yüklenmeden işlenir. Sayfa; dosyayı Google Drive'a yükler ve ardından dosyanın dosyası olarak ekleyebilirsiniz. onsubmit işleyicisinde this anahtar kelimesi biçimin kendisini ifade eder. Sayfadaki tüm formları yüklediğinizde, preventFormSubmit tarafından devre dışı bırakılan varsayılan gönderme işlemi. Bu, bir istisna olması durumunda sayfanın yanlış bir URL'ye yönlendirmesini engelleyebilir.

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function processForm(formObject) {
  var formBlob = formObject.myFile;
  var driveFile = DriveApp.createFile(formBlob);
  return driveFile.getUrl();
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      // Prevent forms from submitting.
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);

      function handleFormSubmit(formObject) {
        google.script.run.withSuccessHandler(updateUrl).processForm(formObject);
      }
      function updateUrl(url) {
        var div = document.getElementById('output');
        div.innerHTML = '<a href="' + url + '">Got it!</a>';
      }
    </script>
  </head>
  <body>
    <form id="myForm" onsubmit="handleFormSubmit(this)">
      <input name="myFile" type="file" />
      <input type="submit" value="Submit" />
    </form>
    <div id="output"></div>
 </body>
</html>

Komut dosyası çalıştırıcıları

google.script.run'ı "komut dosyası çalıştırıcı" için bir oluşturucu olarak düşünebilirsiniz. Şu durumda: veya komut dosyası çalıştırıcısına başarı işleyici, hata işleyici veya kullanıcı nesnesi ekleyebilir. mevcut koşucuyu değiştirmediğinden emin olun. bunun yerine yeni bir komut dosyası çalıştırıcısı yardımcı olabilir.

Herhangi bir kombinasyonu ve herhangi bir withSuccessHandler() siparişini kullanabilirsiniz, withFailureHandler() ve withUserObject(). Ayrıca, Ayarlanmış değere sahip bir komut dosyası çalıştırıcısındaki işlevlerde değişiklik yapma. Yeni değeri, önceki değeri geçersiz kılar.

Bu örnek, üç sunucu çağrısının tümü için ortak bir hata işleyici, ancak iki ayrı başarı işleyiciler:

var myRunner = google.script.run.withFailureHandler(onFailure);
var myRunner1 = myRunner.withSuccessHandler(onSuccess);
var myRunner2 = myRunner.withSuccessHandler(onDifferentSuccess);

myRunner1.doSomething();
myRunner1.doSomethingElse();
myRunner2.doSomething();

Özel işlevler

Adları alt çizgiyle biten sunucu işlevleri gizli olarak kabul edilir. Bu işlevler google.script tarafından çağrılamaz ve adları hiçbir zaman gönderir. Böylece, bunları ekibinizle birlikte ekibinizin sunucuda gizli tutulmalıdır. google.script adlı kullanıcı da şu anda kitaplıklar içindeki işlevler ve en üst düzeyinde belirtilen değerlerdir.

Bu örnekte, getBankBalance() işlevi istemcide kullanılabilir kod; kaynak kodunuzu inceleyen bir kullanıcı, onu arama. Ancak deepSecret_() ve obj.objectMethod() işlevleri yalnızca teslim edilir.

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function getBankBalance() {
  var email = Session.getActiveUser().getEmail()
  return deepSecret_(email);
}

function deepSecret_(email) {
 // Do some secret calculations
 return email + ' has $1,000,000 in the bank.';
}

var obj = {
  objectMethod: function() {
    // More secret calculations
  }
};

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function onSuccess(balance) {
        var div = document.getElementById('output');
        div.innerHTML = balance;
      }

      google.script.run.withSuccessHandler(onSuccess)
          .getBankBalance();
    </script>
  </head>
  <body>
    <div id="output">No result yet...</div>
  </body>
</html>

Uygulamalardaki iletişim kutuları Google Workspace yeniden boyutlandırılıyor

Google Dokümanlar, E-Tablolar veya Google E-Tablolar'daki özel iletişim kutuları Formlar, google.script.host yöntem setWidth(width) veya setHeight(height) inç kodunu girin. (Bir iletişim kutusunun ilk boyutunu ayarlamak için HtmlOutput öğesini kullanın. yöntemler setWidth(width) ve setHeight(height)). İletişim kutuları yeniden boyutlandırıldığında üst pencerede yeniden ortalanmaz ve kenar çubukları yeniden boyutlandırılamaz.

Google Workspaceiçindeki iletişim kutuları ve kenar çubukları kapatılıyor

Bir Google Dokümanlar, E-Tablolar veya Google Dokümanlar'da iletişim kutusu ya da kenar çubuğu Formlar, window.close() öğesini çağırarak arayüzü kapatamazsınız. Bunun yerine aramalı google.script.host.close(). Örnek için HTML'yi kullanıcı arayüzü Google Workspace olarak sunma.

Google Workspaceiçinde tarayıcı odağı taşınıyor

Kullanıcının tarayıcısında odağı bir iletişim kutusundan veya kenar çubuğundan tekrar eski ana ekrana taşımak için Google Dokümanlar, E-Tablolar veya Formlar düzenleyicisini kullanmak için google.script.host.editor.focus(). Bu yöntem özellikle Belge hizmeti yöntemleri Document.setCursor(position) ve Document.setSelection(range).