从网页上运行Google App Script

5
我知道如何编写一个简单的应用程序脚本(一旦发布),提供一个简单的表格(名称和消息),将值推入Google电子表格。
我的问题是:我如何从我的网站运行脚本?我可以建立一个HTML表单,当我提交表单时,它会在电子表格中写入吗?
是否有一种方法“创建”带有必须推送到电子表格中的值的链接?
我在哪里可以找到示例?
谢谢
编辑
GS CODE
var logSheetId = "[SHEETID]"; // Drive ID of log spreadsheet

function doGet(e){
var nome;
var messaggio;

nome = e.parameter.stringaNome;
messaggio=e.parameter.stringaMessaggio;
scriviSpreadsheet(nome,messaggio);
}

function scriviSpreadsheet(nome, messaggio) {
try {

// Open the log and record the new file name, URL and name from form
var ss = SpreadsheetApp.openById(logSheetId);
var sheet = ss.getSheets()[0];
sheet.appendRow([nome, messaggio]);

// Return the new file Drive URL so it can be put in the web app output
//return file.getUrl();
} catch (error) {
return error.toString();
}
}

HTML (external site)

<form id="myForm">
<input type="text" id="nome" name="nome" placeholder="Il tuo nome"/>
<input type="text" id="messaggio" name="messaggio"/>
<input type="button" value="Submit"
  onclick="scrivi()" />
</form>

<script>
function scrivi(){
  var nome= document.getElementById("nome").value;
  var messaggio = document.getElementById("messaggio").value;

  var location = "https://script.google.com/macros/s/[MYSCRIPTID]/exec?stringaNome=" + nome + "&stringaMessaggio=" + messaggio;
  window.location = location;

}

function onFailure(error) {
    alert(error.message);
}
</script>

我知道这不是最好的代码,但它能够运行。

当我点击按钮时,如何避免打开任何页面?


你可以编写一个HTML表单并将其嵌入到网站中,也可以使用Google表单并通过iframe嵌入它,或者您可以制作一个Google网站并直接嵌入GAS。 - Robin Gertenbach
2
如果你的网页可以发出HTTPS请求,那么你可以通过向Apps Script项目的已发布URL发送GET或POST请求来触发一个Apps Script函数的运行。例如,如果您的网页可以使用JavaScript,则可以进行AJAX请求。如果您的网页可以运行服务器端代码,则您的网站服务器端代码可以向Apps Script URL发出GET或POST请求。为了处理GET或POST请求,Apps Script有两个保留函数名称:doGet()doPost()。它们都监视对已发布URL发出请求的事件。 - Alan Wells
@SandyGood 我正在寻找 doGet 和 doPost 的文档,但对我来说看起来很困难...你能提供一个简单的例子吗?(不一定是我需要的完全相同的函数)我需要格式化 URL 吗? - Andrea Volontè
2
如果您曾经使用Apps Script创建过Web应用程序,那么您一定使用过doGet()函数并将其发布。在“发布”菜单中,单击“部署为Web应用程序”,然后会出现一个对话框。在顶部,有一个带有已发布URL的字段。那就是您要使用的URL。有关更多信息,请参见以下内容:Stack Overflow答案链接 - Alan Wells
我会像h0dges提到的那样使用AJAX请求,并避免在表单标签中使用actionmethod属性。 HTML中的表单标签具有可以干扰您所需内容的“内置”行为,正如您所经历的那样。除非您正在使用与表单标签相关的功能,否则不需要它。您可以在DIV标签中格式化布局。我还会摆脱提交按钮,因为它会触发默认的表单行为,在这种情况下您不需要它。只需使用一个常规按钮来触发一个包含AJAX请求的函数即可。 - Alan Wells
显示剩余7条评论
1个回答

8

编辑:已测试并可用。不要忘记将其部署为Web应用程序,授予表单访问脚本的权限,并通过手动运行脚本确保脚本可以访问目标工作表。

form.html:

<form action="https://script.google.com/macros/s/[SCRIPT ID]/exec" method="post">
  Input One:<br>
  <input type="text" name="inputOne"><br>
  Input Two:<br>
  <input type="text" name="inputTwo"><br>
  Input Three:<br>
  <input type="text" name="inputThree"><br>
  Input Four:<br>
  <input type="text" name="inputFour"><br>
  Input Five:<br>
  <input type="text" name="inputFive"><br>
  <input type="submit" value="Submit">
</form>

Code.gs:

function doPost(e) {

  var ss = SpreadsheetApp.openById("SHEET ID");
  var sheet = ss.getSheetByName("Sheet1");
  var sheet_counters = ss.getSheetByName("Counters");

  var id = sheet_counters.getRange("A2").getValue()+1;
  var timeZone = ss.getSpreadsheetTimeZone();
  var timestamp = Utilities.formatDate(new Date(), timeZone, "dd/MM/yyyy HH:mm:ss");

  sheet.appendRow([
    id,
    timestamp,
    e.parameter.inputOne,
    e.parameter.inputTwo,
    e.parameter.inputThree,
    e.parameter.inputFour,
    e.parameter.inputFive]);

  sheet_counters.getRange("A2").setValue(id);
}

我尝试了你的示例,但运行时提示找不到doGet函数。我已将函数“doPost”重命名为“doGet”,但运行时提示无法从未定义的对象(第13行)读取“contents”属性。 - Andrea Volontè
现在脚本可以工作了!如果我不想让确认页面出现怎么办?我希望当我提交表单时,页面重定向到我的主页(或其他托管在我的网站上的页面)。再次感谢。 - Andrea Volontè
将doPost()脚本设置为返回包含重定向的HTMLService页面。或者使用jQuery.ajax()处理原始post请求(http://api.jquery.com/jQuery.ajax/)。这里提供一个示例:https://dev59.com/wGkw5IYBdhLWcg3wY5jq#9933872如果您认为我已经回答了您的问题,请将其标记为正确答案。谢谢。 - h0dges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接