web-dev-qa-db-fra.com

Script Google Apps pour ouvrir une URL

Existe-t-il un moyen d'écrire un script Google Apps, donc lors de son exécution, une deuxième fenêtre de navigateur s'ouvre sur www.google.com (ou un autre site de mon choix)?

J'essaie de trouver une solution à ma question précédente ici: Puis-je ajouter un lien hypertexte dans une boîte de message d'une feuille de calcul Google Apps

21
PY_

Vous pouvez créer une petite interface utilisateur qui fait le travail comme ceci:

function test(){
showURL("http://www.google.com")
}
//
function showURL(href){
  var app = UiApp.createApplication().setHeight(50).setWidth(200);
  app.setTitle("Show URL");
  var link = app.createAnchor('open ', href).setId("link");
  app.add(link);  
  var doc = SpreadsheetApp.getActive();
  doc.show(app);
  }

Si vous voulez "montrer" l'URL, changez simplement cette ligne comme ceci:

  var link = app.createAnchor(href, href).setId("link");

EDIT: lien vers une feuille de calcul de démonstration in lecture seule parce que trop de gens continuent à y écrire des choses indésirables (faites juste une copie à utiliser à la place).

EDIT: UiApp a été déconseillé par Google le 11 décembre 2014, cette méthode peut se casser à tout moment et doit être mise à jour pour utiliser le service HTML à la place!

EDIT: ci-dessous est une implémentation utilisant le service html.

function testNew(){
  showAnchor('Stackoverflow','http://stackoverflow.com/questions/tagged/google-apps-script');
}

function showAnchor(name,url) {
  var html = '<html><body><a href="'+url+'" target="blank" onclick="google.script.Host.close()">'+name+'</a></body></html>';
  var ui = HtmlService.createHtmlOutput(html)
  SpreadsheetApp.getUi().showModelessDialog(ui,"demo");
}
27
Serge insas

Cette fonction ouvre une URL sans nécessiter d'interaction utilisateur supplémentaire.

/**
 * Open a URL in a new tab.
 */
function openUrl( url ){
  var html = HtmlService.createHtmlOutput('<html><script>'
  +'window.close = function(){window.setTimeout(function(){google.script.Host.close()},9)};'
  +'var a = document.createElement("a"); a.href="'+url+'"; a.target="_blank";'
  +'if(document.createEvent){'
  +'  var event=document.createEvent("MouseEvents");'
  +'  if(navigator.userAgent.toLowerCase().indexOf("firefox")>-1){window.document.body.append(a)}'                          
  +'  event.initEvent("click",true,true); a.dispatchEvent(event);'
  +'}else{ a.click() }'
  +'close();'
  +'</script>'
  // Offer URL as clickable link in case above code fails.
  +'<body style="Word-break:break-Word;font-family:sans-serif;">Failed to open automatically. <a href="'+url+'" target="_blank" onclick="window.close()">Click here to proceed</a>.</body>'
  +'<script>google.script.Host.setHeight(40);google.script.Host.setWidth(410)</script>'
  +'</html>')
  .setWidth( 90 ).setHeight( 1 );
  SpreadsheetApp.getUi().showModalDialog( html, "Opening ..." );
}

Cette méthode fonctionne en créant une boîte de dialogue temporaire, elle ne fonctionnera donc pas dans des contextes où le service d'interface utilisateur n'est pas accessible, comme l'éditeur de script ou une formule G Sheets personnalisée.

18

Le script Google Apps n'ouvrira pas automatiquement les pages Web, mais il pourrait être utilisé pour afficher un message avec des liens, des boutons sur lesquels l'utilisateur pourrait cliquer pour ouvrir les pages Web souhaitées ou même pour utiliser objet Window et des méthodes comme addEventListener () pour ouvrir les URL.

Il convient de noter que UiApp est désormais obsolète. De Classe UiApp - Script Google Apps - Développeurs Google

Obsolète. Le service d'interface utilisateur était obsolète le 11 décembre 2014 . Pour créer des interfaces utilisateur, utilisez plutôt service HTML .

L'exemple de la page liée au service HTML est assez simple,

Code.gs

// Use this code for Google Docs, Forms, or new Sheets.
function onOpen() {
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
      .createMenu('Dialog')
      .addItem('Open', 'openDialog')
      .addToUi();
}

function openDialog() {
  var html = HtmlService.createHtmlOutputFromFile('index')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
      .showModalDialog(html, 'Dialog title');
}

Une version personnalisée de index.html pour afficher deux hyperliens

<a href='http://stackoverflow.com' target='_blank'>Stack Overflow</a>
<br/>
<a href='http://meta.stackoverflow.com/' target='_blank'>Meta Stack Overflow</a>
6
Rubén

window.open(url)1 ouvre automatiquement les pages Web, à condition que les bloqueurs de fenêtres publicitaires soient désactivés (comme c'est le cas avec Stephen réponse )

openUrl.html

<!DOCTYPE html>
<html>
  <head>
   <base target="_blank">
    <script>
     var url1 ='https://stackoverflow.com/a/54675103';
     var winRef = window.open(url1);
     winRef ? google.script.Host.close() : window.alert('Allow popup to redirect you to '+url1) ;
     window.onload=function(){document.getElementById('url').href = url1;}
    </script>
  </head>
  <body>
    Kindly allow pop ups</br>
    Or <a id='url'>Click here </a>to continue!!!
  </body>
</html>

code.gs:

function modalUrl(){
  SpreadsheetApp.getUi()
   .showModalDialog(
     HtmlService.createHtmlOutputFromFile('openUrl').setHeight(50),
     'Opening StackOverflow'
   )
}    
2
TheMaster

À partir d'un exemple précédent, je pense qu'il existe une façon plus propre de procéder. Créé un index.html fichier dans votre projet et en utilisant le code de Stephen d'en haut, convertissez-le simplement en un document HTML.

<!DOCTYPE html>
<html>
  <base target="_top">
  <script>
    function onSuccess(url) {
      var a = document.createElement("a"); 
      a.href = url;
      a.target = "_blank";
      window.close = function () {
        window.setTimeout(function() {
          google.script.Host.close();
        }, 9);
      };
      if (document.createEvent) {
        var event = document.createEvent("MouseEvents");
        if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
          window.document.body.append(a);
        }                        
        event.initEvent("click", true, true); 
        a.dispatchEvent(event);
      } else {
        a.click();
      }
      close();
    }

    function onFailure(url) {
      var div = document.getElementById('failureContent');
      var link = '<a href="' + url + '" target="_blank">Process</a>';
      div.innerHtml = "Failure to open automatically: " + link;
    }

    google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).getUrl();
  </script>
  <body>
    <div id="failureContent"></div>
  </body>
  <script>
    google.script.Host.setHeight(40);
    google.script.Host.setWidth(410);
  </script>
</html>

Ensuite, dans votre Code.gs script, vous pouvez avoir quelque chose comme ce qui suit,

function getUrl() {
  return 'http://whatever.com';
}

function openUrl() {
  var html = HtmlService.createHtmlOutputFromFile("index");
  html.setWidth(90).setHeight(1);
  var ui = SpreadsheetApp.getUi().showModalDialog(html, "Opening ..." );
}
2
OaklandFanatic

La seule différence entre ces deux:

  • var link = app.createAnchor ('open', href) .setId ("link");
  • var link = app.createAnchor (href, href) .setId ("link");

est que dans le premier cas le lien affichera "ouvert" dans la boîte de dialogue. Jusqu'à présent, je n'ai trouvé aucun moyen d'ouvrir automatiquement le lien ... (voir https://developers.google.com/apps-script/class_anchor ).

La seule autre façon d'ouvrir automatiquement un document semble être:

var doc = DocumentApp.openById (foundFile.getId ());

mais je ne sais pas trop quoi faire avec doc! C'est à dire. il n'y a pas de doc.show () ...

0
wgw