web-dev-qa-db-fra.com

Comment éviter d'atteindre la limite de quota utilisateur

Le script suivant saisit tous mes contacts d'un groupe spécifique dans une feuille Google. Idéalement, j'aimerais qu'il soit exécuté aussi souvent que possible. Actuellement, avec un déclencheur défini toutes les heures, je reçois la limite de quota suivante après environ 3 heures. Après 12 heures de quota, il reprend pendant 3 heures et se répète.

Problème temporaire - veuillez réessayer plus tard et envisagez d'utiliser des opérations par lots. L'utilisateur est hors quota.

Les quotas ne sont-ils pas sur un cycle de 24 heures? Y at-il quelque chose qui ne va pas avec mon script?

function onOpen()
{
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  menuEntries.Push( {name: "Read Contacts", functionName: "readContacts"} );
  spreadsheet.addMenu("Contacts", menuEntries);
};


function readContacts() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Contacts");

  var group  = ContactsApp.getContactGroup('Apptivo Contacts');
  var contacts = ContactsApp.getContactsByGroup(group);
  var ContactArray  = new Array();
  var ContactArrays = [];

  ContactArray = [];
  ContactArray.Push("");
  ContactArray.Push("FullName");
  ContactArray.Push("Emails");
  ContactArray.Push("PhoneNumbers");
  ContactArray.Push("Company");
  ContactArray.Push("Job Title");
  ContactArray.Push("Notes");  
  ContactArray.Push("HomeAddress");
  ContactArray.Push("WorkAddress");
  ContactArray.Push("URL");
  ContactArray.Push("Groups");

  ContactArrays.Push(ContactArray);

  for (var i=0;i<contacts.length;i++)
  { 
    ContactArray = [];
    ContactArray.Push("");

  //FullName
    ContactArray.Push(contacts[i].getFullName());

  //Emails
    var Emails = "";
    for ( var g=0;g<contacts[i].getEmails().length;g++)
    {
      Emails += contacts[i].getEmails()[g].getAddress();
      if (g + 1 == contacts[i].getEmails().length) break
      Emails += "\n";
    }
    try{ContactArray.Push(Emails);}
      catch(e){ContactArray.Push("N/A")}

  //Phone Numbers
    var Phones = "";    
    for ( var g=0;g<contacts[i].getPhones().length;g++)
    {
      if (contacts[i].getPhones()[g].getLabel() == "MOBILE_PHONE") {
        Phones += "C: "
      } else if (contacts[i].getPhones()[g].getLabel() == "WORK_PHONE") {
        Phones += "W: "
      } else if (contacts[i].getPhones()[g].getLabel() == "HOME_PHONE") {
        Phones += "H: "
      } else if (contacts[i].getPhones()[g].getLabel() == "HOME_FAX") {
        Phones += "F: "
      } else if (contacts[i].getPhones()[g].getLabel() == "WORK_FAX") {
        Phones += "F: "
      } else {
        Phones += "O: "
      }
      Phones += contacts[i].getPhones()[g].getPhoneNumber();
      if (g + 1 == contacts[i].getPhones().length) break
      Phones += "\n" ;
    }
    try{ContactArray.Push(Phones);}
    catch(e){ContactArray.Push("N/A")}

  //Company  
    try{ContactArray.Push(contacts[i].getCompanies()[0].getCompanyName());}
    catch(e){ContactArray.Push("N/A")}

  //JobTitle
    try{ContactArray.Push(contacts[i].getCompanies()[0].getJobTitle());}
    catch(e){ContactArray.Push("N/A")}

  //Notes  
    ContactArray.Push(contacts[i].getNotes());

  //Addresses
    var homeAddress = "" , workAddress = "";     
    for ( var g=0;g<contacts[i].getAddresses().length;g++)
    {
      if (contacts[i].getAddresses()[g].getLabel() == "HOME_ADDRESS") {
        homeAddress += contacts[i].getAddresses()[g].getAddress();
      } else if (contacts[i].getAddresses()[g].getLabel() == "WORK_ADDRESS") {
        workAddress += contacts[i].getAddresses()[g].getAddress();
      }
    }
    //Home
    try{ContactArray.Push(homeAddress);}
      catch(e){ContactArray.Push("N/A")}
    //Work
    try{ContactArray.Push(workAddress);}
      catch(e){ContactArray.Push("N/A")}  

  //URLs  
    try{ContactArray.Push(contacts[i].getUrls()[0].getAddress());}
    catch(e){ContactArray.Push("N/A")}

  //Groups
    var ListofGroups = "";    
    for ( var g=0;g<contacts[i].getContactGroups().length;g++)
    {
      ListofGroups += contacts[i].getContactGroups()[g].getName();
      ListofGroups += " | ";
    }
    try{ContactArray.Push(ListofGroups);}
      catch(e){ContactArray.Push("N/A")}


    ContactArrays.Push(ContactArray);
  }

  //If Array is not blank(to avoid quota issues)
 if (12 < ContactArrays.length) {
  // Re-populate sheet
   sheet.clear();
   sheet.getRange(1,1,ContactArrays.length,ContactArrays[0].length).setValues(ContactArrays);
   }

};
1
David Meffe

Je pense qu'il est possible de réduire le nombre d'appels get* dans votre script. Ces appels vident le quota des services Google. Pour commencer avec un exemple simple,

for ( var g=0;g<contacts[i].getEmails().length;g++)
{
  Emails += contacts[i].getEmails()[g].getAddress();
  if (g + 1 == contacts[i].getEmails().length) break
  Emails += "\n";
}

peut être remplacé par

var contactEmails = contacts[i].getEmails();
for ( var g=0; g<contactEmails.length;g++)
{
  Emails += contactEmails[g].getAddress();
  if (g + 1 == contactEmails.length) break
  Emails += "\n";
}

Bien que cela n’affecte pas les quotas, je mentionnerai map et join les méthodes de tableaux JavaScript, ce qui pourrait réduire ce qui précède à

var Emails = contacts[i].getEmails().map(function(email) {
  return email.getAddress();
}).join("\n");

De même, les appels répétés à contacts[i].getPhones() doivent être remplacés par un var contactPhones = contacts[i].getPhones();, et les travaux ultérieurs doivent se produire avec ce tableau.

Idem pour les entreprises, adresses, groupes, etc.

3
user135384

Le réponse de @ zaq est tout à fait correct. En règle générale, vous appelez les API Google à chaque fois que vous effectuez un appel getXXX(). Par conséquent, toutes les données utiles renvoyées doivent être mises en cache. N'effectuez ces appels que lorsque vous avez vraiment besoin d'une actualisation des valeurs. Script Google Apps est puissant et gratuit (pour la plupart), gardons-le ainsi en minimisant vos appels - votre script s'exécutera également plus rapidement!

Également utiles pour la conversation sont les quotas globaux de script d’applications , presque tous les jours, tandis que d’autres ont une granularité plus fine. Vers le bas de cette page, vous trouverez également des messages d'erreur spécifiques facilitant le débogage. Voici une page de dépannage de la documentation avec encore plus de conseils.

AVERTISSEMENT: Je suis un développeur avocat pour les scripts d'applications. Les débutants peuvent apprendre de plusieurs vidéos que j'ai faites pour les initier aux développeurs. Allez à cette playlist YT et découvrez les épisodes 5, 8, 22 et 24. Je devrais en avoir quelques autres plus tard en 2017.

1
wescpy