如何在 google apps 脚本函数中使用模态表单数据?
How to use the modal form data in the google apps script functions?
所以,我得到了一个 google apps 脚本,它被放置在我的电子表格 'AllScripts' 上。我不是那种想要它的人,但它必须写在一个单独的电子表格中。
在电子表格 'wb1' apps 脚本中,我从 'AllScripts' 导入代码作为库,因此我可以在 'wb1' 上调用它的方法。 'wb1' 上还有 onOpen
方法,它使用 'AllScripts' 中的方法创建菜单并添加项目。到这里为止都很好。
下面的电子表格中提供了最少的可重现代码。
这些分别是 'wb1' 电子表格和 'AllScripts' 电子表格:
https://docs.google.com/spreadsheets/d/1uQz8q1AE7vs9eJCajnIAPmQZRQgBoZv1mF9dcH9D_l8/edit?usp=sharing
https://docs.google.com/spreadsheets/d/1YaO18yRagzG4wA46AGnzn94CR6Vy6ENZcsbLZKN6OgM/edit?usp=sharing
请注意,一开始您看不到菜单,也无法 运行 任何代码,因此 'wb1' 转到 Extensions > Apps脚本 然后 运行 onOpen
。它会询问你的权限,我不知道为什么,它会打开一个带有安全警告的window。
无论如何,当您从菜单 Scripts > Test 打开模态并编写要求的内容时,在浏览器上打开您的控制台,您应该会看到如下内容:
[![错误][1]][1]
我不知道怎么读,但显然在 'wb1' 上打开的模态代码无法打开 'AllScripts'.
上的方法
我们如何克服这个问题?
这些是脚本中的一些代码:
ShowForm.gs:
function showForm() {
const form = HtmlService.createTemplateFromFile('Form').evaluate().setHeight(480);
SpreadsheetApp.getUi().showModalDialog(form, 'Request Data Window');
}
SaveData.gs:
function saveData(data) {
const iasRequestsSpreadsheet = SpreadsheetApp.openById('1uQz8q1AE7vs9eJCajnIAPmQZRQgBoZv1mF9dcH9D_l8');
const sheet = iasRequestsSpreadsheet.getSheetByName('page1');
const line = getFirstEmptyRow(sheet);
// request date
sheet.getRange(line, 1).setValue(new Date());
// requested by
sheet.getRange(line, 2).setValue(data.requestedBy);
const currentWorkbook = SpreadsheetApp.getActiveSpreadsheet()
.getName()
.split('-')
.trim();
// product
sheet.getRange(line, 3).setValue(currentWorkbook);
const tabName = SpreadsheetApp.getActiveSheet().getName();
// activity
sheet.getRange(line, 4).setValue(`Do stuffs on ${tabName}`);
// due date
sheet.getRange(line, 6).setValue(data.dueDate);
// status
sheet.getRange(line, 8).setValue('Pending');
// comments
sheet.getRange(line, 9).setValue(data.comments);
}
Form.html:
ps.: 我删除了 Materialize 的东西,所以按照@Rubén 的建议更容易阅读。
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<form>
<label for="requestedBy">Requested By</label>
<input id="requestedBy" type="text" placeholder="John Doe">
<label for="dueDate">Due Date</label>
<input id="dueDate" class="datepicker">
<label for="comments">Comments</label>
<textarea id="comments" placeholder="Please ignore lines X, Y and Z..." class="materialize-textarea"></textarea>
<button id="btn">
Submit
</button>
</form>
<script>
document.getElementById('btn').addEventListener('click', getData);
function getData() {
var requestedBy = document.getElementById('requestedBy').value;
var dueDate = document.getElementById('dueDate').value;
var comments = document.getElementById('comments').value;
var data = {
requestedBy: requestedBy,
dueDate: dueDate,
comments: comments
};
google.script.run.saveData(data);
}
</script>
</body>
</html>
尝试
在html
function getData() {
var data = document.forms[0]
var tab = []
for (var i=0;i<data.length;i++){
if (data[i].type != "button"){
tab.push(data[i].value)
}
}
google.script.run.saveData(tab);
// document.forms[0].reset()
}
gs
function saveData(tab) {
const iasRequestsSpreadsheet = SpreadsheetApp.openById('exampleid');
const sheetName = iasRequestsSpreadsheet.getSheetByName('examplename');
sheetName.getRange(1, 1,1,tab.length).setValues([tab]);
}
所以,我得到了一个 google apps 脚本,它被放置在我的电子表格 'AllScripts' 上。我不是那种想要它的人,但它必须写在一个单独的电子表格中。
在电子表格 'wb1' apps 脚本中,我从 'AllScripts' 导入代码作为库,因此我可以在 'wb1' 上调用它的方法。 'wb1' 上还有 onOpen
方法,它使用 'AllScripts' 中的方法创建菜单并添加项目。到这里为止都很好。
下面的电子表格中提供了最少的可重现代码。
这些分别是 'wb1' 电子表格和 'AllScripts' 电子表格: https://docs.google.com/spreadsheets/d/1uQz8q1AE7vs9eJCajnIAPmQZRQgBoZv1mF9dcH9D_l8/edit?usp=sharing https://docs.google.com/spreadsheets/d/1YaO18yRagzG4wA46AGnzn94CR6Vy6ENZcsbLZKN6OgM/edit?usp=sharing
请注意,一开始您看不到菜单,也无法 运行 任何代码,因此 'wb1' 转到 Extensions > Apps脚本 然后 运行 onOpen
。它会询问你的权限,我不知道为什么,它会打开一个带有安全警告的window。
无论如何,当您从菜单 Scripts > Test 打开模态并编写要求的内容时,在浏览器上打开您的控制台,您应该会看到如下内容: [![错误][1]][1]
我不知道怎么读,但显然在 'wb1' 上打开的模态代码无法打开 'AllScripts'.
上的方法我们如何克服这个问题?
这些是脚本中的一些代码:
ShowForm.gs:
function showForm() {
const form = HtmlService.createTemplateFromFile('Form').evaluate().setHeight(480);
SpreadsheetApp.getUi().showModalDialog(form, 'Request Data Window');
}
SaveData.gs:
function saveData(data) {
const iasRequestsSpreadsheet = SpreadsheetApp.openById('1uQz8q1AE7vs9eJCajnIAPmQZRQgBoZv1mF9dcH9D_l8');
const sheet = iasRequestsSpreadsheet.getSheetByName('page1');
const line = getFirstEmptyRow(sheet);
// request date
sheet.getRange(line, 1).setValue(new Date());
// requested by
sheet.getRange(line, 2).setValue(data.requestedBy);
const currentWorkbook = SpreadsheetApp.getActiveSpreadsheet()
.getName()
.split('-')
.trim();
// product
sheet.getRange(line, 3).setValue(currentWorkbook);
const tabName = SpreadsheetApp.getActiveSheet().getName();
// activity
sheet.getRange(line, 4).setValue(`Do stuffs on ${tabName}`);
// due date
sheet.getRange(line, 6).setValue(data.dueDate);
// status
sheet.getRange(line, 8).setValue('Pending');
// comments
sheet.getRange(line, 9).setValue(data.comments);
}
Form.html: ps.: 我删除了 Materialize 的东西,所以按照@Rubén 的建议更容易阅读。
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<form>
<label for="requestedBy">Requested By</label>
<input id="requestedBy" type="text" placeholder="John Doe">
<label for="dueDate">Due Date</label>
<input id="dueDate" class="datepicker">
<label for="comments">Comments</label>
<textarea id="comments" placeholder="Please ignore lines X, Y and Z..." class="materialize-textarea"></textarea>
<button id="btn">
Submit
</button>
</form>
<script>
document.getElementById('btn').addEventListener('click', getData);
function getData() {
var requestedBy = document.getElementById('requestedBy').value;
var dueDate = document.getElementById('dueDate').value;
var comments = document.getElementById('comments').value;
var data = {
requestedBy: requestedBy,
dueDate: dueDate,
comments: comments
};
google.script.run.saveData(data);
}
</script>
</body>
</html>
尝试
在html
function getData() {
var data = document.forms[0]
var tab = []
for (var i=0;i<data.length;i++){
if (data[i].type != "button"){
tab.push(data[i].value)
}
}
google.script.run.saveData(tab);
// document.forms[0].reset()
}
gs
function saveData(tab) {
const iasRequestsSpreadsheet = SpreadsheetApp.openById('exampleid');
const sheetName = iasRequestsSpreadsheet.getSheetByName('examplename');
sheetName.getRange(1, 1,1,tab.length).setValues([tab]);
}