Как создать Google Web App, которая может создать новый Google Doc, а затем открыть его на вкладке браузера? - PullRequest
0 голосов
/ 14 февраля 2019

Я написал скрипт, который создает новый Google Doc (шаблон лирического листа).Теперь я хочу вставить этот скрипт в скрипт Google Web App, который я могу прикрепить к кнопке на (новом) сайте Google.Когда пользователь нажимает эту кнопку (называемую что-то вроде «Новая песня»), новый шаблон песни создается и затем открывается на вкладке браузера, готовый для изменения в качестве новой песни.Я не могу понять, как заставить веб-приложение делать что-либо, кроме открытия существующего документа или листа Google и т. Д. Другими словами, команда doGet никогда не запускает HTML-код для создания нового лирического документа Google.Мой рабочий код для создания лирического документа выглядит следующим образом:

Часть II: я переработал код, на который я ссылаюсь в комментариях ниже, и я могу создать и открыть новый лирический документ, но не могу получить форматированиечасть скрипта для работы (как отмечено ниже).

 function createNewLandscapeSong() {
   var doc = DocumentApp.create('Rename with song title');
   var title = "replace with song title"
   var url = doc.getUrl();
   var body = doc.getBody();
   var paragraph = body.insertParagraph(0, "");
   var text1 = paragraph.appendText("© replace with writer(s)");
  text1.setFontSize(8);
   var rowsData = [['PUT FIRST VERSE/CHORUS HERE.', 'PUT SECOND VERSE/NEXT CHORUS/BRIDGE/ETC HERE.']];
    var style = {};
   body.insertParagraph(0, title)
       .setHeading(DocumentApp.ParagraphHeading.HEADING3);
   table = body.appendTable(rowsData);
   style[DocumentApp.Attribute.BORDER_WIDTH] = 0;
   table.setAttributes(style);
 }

Часть II Код:

 function doGet(e){

  // create the doc
  var doc = createDoc()

  // save the doc to Drive
  var driveFile = DriveApp.createFile(doc).setName("New Lyric");

  // tell the user how to access it
  var fileURL = driveFile.getUrl();
  var fileName = driveFile.getName();

  var HTMLOutput = HtmlService.createHtmlOutput("<p>You made a new lyric doc.</p>"
  + "<p> You can access it here: "
  + '<a target="blank" href="' + fileURL + '">' + fileName + '</a></p>');
  return HTMLOutput
 }

  function createDoc() {
  var doc = DocumentApp.create('Rename with song title');
  // Code below not working
  var title = "replace with song title and then link this text to song title cell in Catalog Spreadsheet"
  var id = doc.getId();
  var body = doc.getBody();
  var paragraph = body.insertParagraph(0, "");
  var text1 = paragraph.appendText("© replace with writer(s)");
text1.setFontSize(8);
  var rowsData = [['PUT FIRST VERSE/CHORUS HERE.  (SUGGEST USE ALL CAPS.)', 'PUT SECOND VERSE/NEXT CHORUS/BRIDGE/ETC HERE.']];
  var style = {};
      body.insertParagraph(0, title)
     .setHeading(DocumentApp.ParagraphHeading.HEADING3);
      table = body.appendTable(rowsData);
      style[DocumentApp.Attribute.BORDER_WIDTH] = 0;
      table.setAttributes(style);
  // End of code section not working
  return doc
 }

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019
  1. doGet() запускается только при первом открытии веб-приложения в браузере.Любые дополнительные вызовы серверного скрипта должны выполняться с помощью клиент-серверного взаимодействия .

  2. Возможно, будет проще извлечь ваш HTML из вашего серверного скрипта.Это поможет вам написать код на веб-странице HTML для выполнения вызовов вашей серверной функции.

Таким образом, у вас будет 2 отдельных файла : Code.gsи Index.html.

Code.gs

/*
  This function simply returns the html we've created to the client for display.
*/
function doGet() {
  return HtmlService
      .createTemplateFromFile('Index')
      .evaluate();
}


/*
The scripts below this line are to alow the client-side scripts from the Index.html page call and get information from the server-side script.
*/

function createNewLandscapeSong() {
  var doc = DocumentApp.create('Rename with song title');
  var title = "replace with song title"
  var url = doc.getUrl();
  var body = doc.getBody();
  var paragraph = body.insertParagraph(0, "");
  var text1 = paragraph.appendText("© replace with writer(s)");
  text1.setFontSize(8);
  var rowsData = [['PUT FIRST VERSE/CHORUS HERE.', 'PUT SECOND VERSE/NEXT CHORUS/BRIDGE/ETC HERE.']];
  var style = {};
  body.insertParagraph(0, title)
  .setHeading(DocumentApp.ParagraphHeading.HEADING3);
  table = body.appendTable(rowsData);
  style[DocumentApp.Attribute.BORDER_WIDTH] = 0;
  table.setAttributes(style);

  return {
    url: url,
    title: title
  };
}

Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <input type="button" value="Make Doc"
      onclick="google.script.run
          .withSuccessHandler(openNewDoc)
          .createNewLandscapeSong()" />
    <script>
       function openNewDoc(results){
           window.open(results.url, '_blank').focus();
       }
    </script>
  </body>
</html>

Таким образом, веб-страница вызывает код на стороне сервера, чтобы сделатьдокумент и получить его URL.Затем мы используем этот URL, чтобы открыть этот документ на новой вкладке.

0 голосов
/ 14 февраля 2019

пользователь нажимает кнопку, на которую вы помещаете прослушиватель событий, затем запускаете функцию, открывающую файл

  in the HTML - the BUTTON
   <div>                   
     <div id="submit">OPEN THE FILE IN A NEW TAB</div> 
   </div>
 in the SCRIPT of the HTML
 <script>
  document.getElementById("submit").addEventListener("click",openFile)
  function openFile() {
    window.open('url');
    google.script.run.createNewLandscapeSong();  
  }
</script>
...