【问题标题】:How do I get data from a prompt or dialog and put it in a Google Doc via Google Web App Script如何从提示或对话框中获取数据并通过 Google Web App Script 将其放入 Google Doc
【发布时间】:2019-07-13 00:39:37
【问题描述】:

我想使用 Google 脚本创建一个 Google Doc,并根据用户输入命名新的文档。

下面的代码确实创建了新文档(Web 应用程序附加到新 Google 站点上的按钮)。现在我想添加从用户那里获取歌曲标题的代码。经过三天的寻找,我只是不知道如何做到这一点。

我能找到的最接近的代码是:write data in google sheet using a web script app

但它适用于 Google 表格,而不是 Docs。

到目前为止,用于创建文档的代码是:

Code.gs

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="Create New Song Doc"
      onclick="google.script.run
          .withSuccessHandler(openNewDoc)
          .createNewLandscapeSong()" />
    <script>
       function openNewDoc(results){
           window.open(results.url, '_blank').focus();
       }
    </script>
  </body>
</html>
  </body>
</html>

所以,我知道在这段代码的某处我需要添加代码,提示用户输入歌曲标题,然后我需要将其设置为变量并将其插入为文档的名称和标题歌曲(我的“var doc”和“var title”)。我只是不知道该怎么做。

根据 Sandy 的输入修改代码:

Code.gs

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

function createNewLandscapeSong(objArgs) {
  var docName = objArgs.docName;
  var songTitle = objArgs.songTitle;
  var songWriters = objArgs.songWriters;

  Logger.log('title: ' + title)

  var doc = DocumentApp.create(docName);

  var url = doc.getUrl();
  var body = doc.getBody();
  var paragraph = body.insertParagraph(0, "");
  var text = paragraph.appendText(songWriters);
  text.setFontSize(8);
  var rowsData = [['PUT FIRST VERSE/CHORUS HERE.', 'PUT SECOND     VERSE/NEXT CHORUS/BRIDGE/ETC HERE.']];
  var style = {};
  body.insertParagraph(0, songTitle)
  .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>
    Fill in fields below to name Google Lyric Document and add the song title and writers.<br><br>
    <input id="idNewDocName" type="text" placeholder="Google Doc Name"><br><br>
    <input id="idNewSongTitle" type="text" placeholder="Song Title"><br><br>
    <input id="idNewSongWriters" type="text" placeholder="Song Writers"><br><br>

    <button onclick="saveUserInput()">Create New Lyric Doc</button>

    <script>
      window.saveUserInput = function() {
      var docName = document.getElementById('idNewDocName').value;
      var songTitle = document.getElementById('idNewSongTitle').value;
      var songWriters = document.getElementById('idNewSongWriters').value;

    console.log('songTitle: ' + songTitle)

    google.script.run
      .withSuccessHandler(openNewDoc)
      .createNewLandscapeSong({docName:docName,songTitle:songTitle, songWriters: songWriters})

      }

       function openNewDoc(results){
           window.open(results.url, '_blank').focus();
       }
    </script>
  </body>
</html>

【问题讨论】:

    标签: google-apps-script dialog google-docs prompt


    【解决方案1】:

    您需要几个输入字段。此示例显示了一种从输入字段中获取值的方法。这个例子没有使用表单标签,因为使用表单标签会导致在提交表单后刷新浏览器选项卡,这会让人们感到困惑,而且通常不是他们想要的。

    要调试代码,请在 Chrome 浏览器中按 f12 键打开开发者工具。单击按钮后,您应该会在控制台日志中看到歌曲标题的值。将数据作为对象传递给服务器代码。运行代码后,从代码编辑器中单击查看菜单,然后选择日志以查看日志打印输出。

    这显示了一种从 Web 应用程序获取用户输入并将其传递到 Apps 脚本中的服务器代码的方法。

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
      </head>
      <body>
    
        <input id="idNewDocName" type="text" placeholder="New Doc Name">
        <input id="idNewSongTitle" type="text" placeholder="New Song Title">
    
        <button onclick="saveUserInput()">Create New Song Doc</button>
    
        <script>
          window.saveUserInput = function() {
            var docName = document.getElementById('idNewDocName').value;
            var songTitle = document.getElementById('idNewSongTitle').value;
    
            console.log('songTitle: ' + songTitle)
    
            google.script.run
              .withSuccessHandler(openNewDoc)
              .createNewLandscapeSong({docName:docName,songTitle:songTitle})
    
          }
    
           function openNewDoc(results){
               window.open(results.url, '_blank').focus();
           }
        </script>
      </body>
    </html>
    

    代码.gs

    function createNewLandscapeSong(objArgs) {
      var docName = objArgs.docName;
      var title = objArgs.songTitle;
    
      Logger.log('title: ' + title)
    
      var doc = DocumentApp.create(docName);
    
      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
      };
    }
    

    【讨论】:

    • 我收到以下错误:“TypeError:无法从未定义中读取属性“docName”。”上线:“var docName = objArgs.docName;”我假设 objArgs 将变量从 index.html 脚本传递到 createNewLandscapeSong 函数,但我之前从未遇到过 objArgs。 (我将研究我的目的,以更好地了解它在做什么。)
    • 另外,以下行中有一个关闭引号,但我看不到打开引号:.createNewLandscapeSong({docName:docName,songTitle:songTitle, songWriters: songWriters})" 它看起来像我就像这是将变量传递给 Code.gs 的行(注意,我添加了一个 writers 字段)。这些值是否应该由 objArgs 语句获取?
    • 如果您从代码编辑器运行createNewLandscapeSong 函数,则不会向该函数传递任何内容。如果通过单击输入表单中的按钮调用objArgs,它将被分配一个值。我删除了行尾的双引号。 objArgs 参数只是给定的名称,就像为变量分配名称一样。你可以使用任何名称。这个名字没什么特别的。
    • 好的。伟大的。我明白。 (顺便说一句,非常感谢您的帮助。)所以,我保存了修改后的脚本,部署为 Web 应用程序,点击更新按钮,在 Google 站点按钮中安装新的 URL 地址,发布站点,刷新发布的站点并单击按钮。我填写了字段并单击了 Create New Doc 按钮,但没有任何反应。当我检查我的 Google Drive 以查看是否已创建新文档时,它没有。有问题的新修订代码发布。
    • 发布的Web App的url总是一样的。当您发布新版本时,网址不会更改。有两个 Web App url,“exec”版本和“dev”(开发)版本。要在无需重新发布的情况下测试您的 Web 应用程序,您可以使用“开发”版本。而且您无需从您的 Google 站点对其进行测试。您可以单击“最新代码”链接来测试现有代码。此外,在代码编辑器中,单击“查看”和“执行记录”以查看是否有错误。有时可能会出现停止代码但无法显示的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多