开发者问题收集

函数未在 Google 脚本 HTML 服务中执行

2020-10-30
931

我正在为自己和同学编写一个工具,它将创建一个 Google 文档并将其通过电子邮件发送给选定的老师,使用所有已填写的字段并填充所有未使用所选科目(例如语言艺术)的默认值的字段,但获取所选信息并使用它发送电子邮件的函数未执行。我检查了项目的执行情况,函数 customDoc() 一次都没有执行过。我怀疑这是我的 HTML 的问题,因为当我在编辑器中测试该函数以查看是否存在语法错误时,我没有看到任何错误消息,但它很干净,只是从未执行过。这是我的代码,虽然错误可能出现在 HTMl 中,但我也会提供我的 JS。

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

function showDialoge() {
  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('Index.html'), 'Test');
}

function customDoc(clicked_id) {
  var d = new Date();
  var s = (d.getDate()) + '/' + (d.getMonth() + 1) + '/' + d.getFullYear();
  console.log(s);
  var cycler = clicked_id
  var math = ['[email protected]', 'math for ']
  var LA = ['[email protected]', 'la for ']
  var science = ['[email protected]', 'science for ']
  var is = ['[email protected]', 'I&S for ']
  var span = ['[email protected]', 'Espanol para ']
  var presets = [math, LA, science, is, span]
  var email1 = document.getElementById('Email')
  var subject1 = document.getElementById('Sub')
  var docName1 = document.getElementById('docName')
  var message1 = document.getElementById('message')
  var email = null
  if (email1 != ' ') {
    email = email1
  } else {
    email = presets[cycler];
    [1];
  }
  var subject = null
  if (subject1 != ' ') {
    subject = subject1
  } else {
    subject = presets[cycler];
    [2]; + s
  }
  var doc = null
  if (docName1 != ' ') {
    doc = docName1
  } else {
    doc = presets[cycler];
    [2]; + s
  }
  var document = documentApp.create(doc)
  var url = document.getUrl();
  var message = null
  if (message1 != ' ') {
    message = message1 + '' + url
  } else {
    message = url
  }

  GmailApp.sendEmail(email, subject, message);
}
<!DOCTYPE html>
<script src="Code.gs"></script>
<html>
<h1>CREATE DOC</h1>

<body>


</body>
<p>Email</p>
<input type='text' id='Email' value=' ' style="border-radius: 20px; border-color: crimson; border-width:20px; ">
<p style=" font-family: Times New Roman, Times, serif;">Doc name</p>
<input type='text' id='docName' value=' ' style="border-radius: 20px; border-color: crimson; border-width:20px; ">
<p>Subject</p>
<input type='text' id='Sub' value=' ' style="border-radius: 20px; border-color: crimson; border-width:20px; ">
<p>message</p>
<input type='text' id='message' value=' ' style="border-radius: 20px; border-color: crimson; border-width:20px; ">

<h2>Fill blanks for subject: </h2>


<button id='2' onclick=c ustomDoc(this.id)> LA </button>
<button id='3' onclick=c ustomDoc(this.id)> Science </button>
<button id='4' onclick=c ustomDoc(this.id)> Individuals and societies </button>
<button id='5' onclick=c ustomDoc(this.id)> Spanish  </button>
<button id='1' onclick=c ustomDoc(this.id)> math </button>


</html>
1个回答

简而言之, customDoc() 是一个服务器函数,您需要使用 google.script.run 来告诉 Apps Script 运行特定的服务器函数。因此,不要调用 onclick="customDoc(this.id)" ,而是尝试 onclick="google.script.run.customDoc(this.id)" 。不要在您的 HTML 文件中包括 Code.gs,因为那是服务器端代码,无法正常工作。我强烈建议您阅读 客户端到服务器通信指南

您的 customDoc() 函数是另一回事 :) 下面是使用 对象 重新组织不同预设(例如主题)的一种非常简单的方法。我还用 Utilities.formatDate() 替换了您的日期格式代码,这可能更容易理解。

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

function customDoc(subject) {
  var subjects = {
    'math': {
      email: '[email protected]',
      preSubject: 'math for '
    },
    'la': {
      email: '[email protected]',
      preSubject: 'la for '
    },
    'science': {
      email: '[email protected]',
      preSubject: 'science for '
    },
    'is': {
      email: '[email protected]',
      preSubject: 'I&S for '
    },
    'spanish': {
      email: '[email protected]',
      preSubject: 'Español para '
    }
  };

  var formattedDate = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'M/d/yyyy');
  
  console.log('Today: ' + formattedDate);
  console.log('Subject: ' + subject);
  console.log(subjects[subject]);
}
<!DOCTYPE html>
<html>
  <body>
    <h1>CREATE DOC</h1>
    <p>Email</p>
    <input type="text" id="Email" value=" " style="border-radius: 20px; border-color: crimson; border-width: 20px" />
    
    <p style="font-family: Times New Roman, Times, serif">Doc name</p>
    <input type="text"  id="docName" value=" " style="border-radius: 20px; border-color: crimson; border-width: 20px" />
    
    <p>Subject</p>
    <input type="text" id="Sub" value=" " style="border-radius: 20px; border-color: crimson; border-width: 20px" />
    
    <p>message</p>
    <input type="text" id="message" value=" " style="border-radius: 20px; border-color: crimson; border-width: 20px" />

    <h2>Fill blanks for subject:</h2>

    <button id="la" onclick="google.script.run.customDoc(this.id)">LA</button>
    <button id="science" onclick="google.script.run.customDoc(this.id)">Science</button>
    <button id="is" onclick="google.script.run.customDoc(this.id)">Individuals and societies</button>
    <button id="spanish" onclick="google.script.run.customDoc(this.id)">Spanish</button>
    <button id="math" onclick="google.script.run.customDoc(this.id)">math</button>
  </body>
</html>

尝试运行上述代码并单击科学按钮。您应该会得到如下执行日志:

Today: 10/30/2020
Subject: science
{preSubject=science for , [email protected]}

现在 customDoc() 正在实际执行,您可以开始尝试修复 Google Doc 生成。在我看来,您正在创建一个完全空白的 Google Doc,这可能不是您想要的。我认为您需要再进行一些工作,然后如果您对生成文档有更具体的问题,请再回来。祝你好运!

Diego
2020-10-31