库函数不工作:未捕获到 saveData
Library function not working: Uncaught at saveData
因此,我必须构建一个脚本,使用 google apps 脚本向用户询问一些信息。这些代码必须在特定的电子表格中(第一个 URL),HTML 表单也将由模式对话框加载。
即使代码是在电子表格 SCRIPTS 中编写的,该项目也会作为库从电子表格 workbook 加载到项目中,这是将创建一个菜单的电子表格,该菜单将从 SCRIPTS.
加载代码
最终目标是:用户打开 workbook,运行s 来自 MyMenu > Form
的项目,打开 modal/form;用户写下他的信息并点击提交。之后,来自 SCRIPTS 的函数 saveData
会将信息写入电子表格 requests.
Obs.: 由于saveData
需要调用 SCRIPTS 项目中托管的 2 个方法,它也需要在同一项目中托管。
脚本:https://docs.google.com/spreadsheets/d/1Dkntw25H41JTk0R3Rm9fgiwt_RrAee9zYEz1Wy8DomI/edit?usp=sharing
请求:https://docs.google.com/spreadsheets/d/1o8JbVelmSNoGn6sn7laatBam_2WTtToB_nlZMTFY_Rg/edit?usp=sharing
工作簿:https://docs.google.com/spreadsheets/d/17plSc9-kPj6XMBENBLJEE6sc01i82xfhGGPQ1UmOXjE/edit?usp=sharing
这里的问题是,在我上面分享的电子表格上,一切都完美无缺,但在我需要处理的原始电子表格上(那里有我工作中的敏感数据,我无法分享 url),当我点击按钮 submit
时,我只在控制台上收到此错误,但没有任何效果:
PS.: 虽然我不能分享我工作的电子表格,但是所有的代码,从工作簿中的代码到脚本电子表格中的代码都和我一模一样为我的工作写的,就像我在这里说的那样使用不同的电子表格,但我仍然收到以下错误:
一些可能对您有帮助的代码:
项目:工作簿
// Code.gs
function onOpen() {
SpreadsheetApp.getUi().createMenu('MyMenu').addItem('Form', 'closeKits').addToUi();
}
// CloseKits.gs
function closeKits() {
scripts.showForm();
}
function callLibraryFunction(data){
scripts.saveData(data);
}
appsscript.json
{
"timeZone": "America/New_York",
"dependencies": {
"libraries": [
{
"userSymbol": "scripts",
"version": "0",
"libraryId": "1AhbUglj05OrQuaZFqQcL_0UB7MCGope2YpVnE7eOGYjdxiXug0DiDA1i",
"developmentMode": true
}
]
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
项目脚本:
<!-- Form.html -->
<!DOCTYPE html>
<html>
<head>
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--Import materialize.css-->
<!-- Compiled and minified CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!--Let browser know website is optimized for mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<div class="container">
<form class="col s12">
<div class="row">
<label for="requestedBy">Requested By</label>
<input id="requestedBy" type="text" placeholder="John Doe" class="validate">
</div>
<div class="row">
<label for="dueDate">Due Date</label>
<input id="dueDate" class="datepicker">
</div>
<div class="row">
<label for="comments">Comments</label>
<textarea id="comments" placeholder="Please ignore lines X, Y and Z..." class="materialize-textarea"></textarea>
</div>
<div class="row">
<button class="btn waves-effect waves-light" id="btn">
Submit
</button>
</div>
</form>
</div>
<!-- Compiled and minified JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
var options = {
autoClose: true,
format: 'mm/dd/yyyy',
defaultDate: new Date(),
setDefaultDate: true,
showClearBtn: true
};
document.addEventListener('DOMContentLoaded', function() {
var elements = document.querySelectorAll('.datepicker');
var instances = M.Datepicker.init(elements, options);
});
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.callLibraryFunction(data);
}
</script>
</body>
</html>
这里我不得不使用 workbook 中 Code.gs
中的 callLibraryFunction
来调用库函数 saveData
,因为HTML 客户端 运行ning 在 workbook.
上看不到最后一个方法
// SaveData.gs
function saveData(data) {
const iasRequestsSpreadsheet = SpreadsheetApp.openById('1o8JbVelmSNoGn6sn7laatBam_2WTtToB_nlZMTFY_Rg');
const sheet = iasRequestsSpreadsheet.getSheetByName('page1');
const line = getFirstEmptyRow(sheet);
// requested by
sheet.getRange(line, 2).setValue(data.requestedBy);
// due date
sheet.getRange(line, 6).setValue(data.dueDate);
// comments
sheet.getRange(line, 9).setValue(data.comments);
}
// ShowForm.gs
function showForm() {
const form = HtmlService.createTemplateFromFile('Form').evaluate().setHeight(480);
SpreadsheetApp.getUi().showModalDialog(form, 'Form');
}
// GetFirstEmptyRow.gs
function getFirstEmptyRow(sheet) {
const column = sheet.getDataRange();
const values = column.getValues();
let row = 0;
for (row; row<values.length; row++) {
if (!values[row].join("")) {
break;
}
}
return (row+1);
}
请随时询问任何其他信息以解决此问题,并访问这些电子表格和 运行 一旦 工作簿 中的 onOpen
,因此它向您请求所需的权限。
编辑:
正如所问,点击 submit
后,在电子表格 workbook
上,我在日志中只得到了这个:
好吧,显然这是浏览器的问题...在我的工作笔记本上,它使用边缘工作,而对于我的同事,它在 chrome 和边缘上工作。但是我还是不知道这里的不兼容是什么。
因此,我必须构建一个脚本,使用 google apps 脚本向用户询问一些信息。这些代码必须在特定的电子表格中(第一个 URL),HTML 表单也将由模式对话框加载。
即使代码是在电子表格 SCRIPTS 中编写的,该项目也会作为库从电子表格 workbook 加载到项目中,这是将创建一个菜单的电子表格,该菜单将从 SCRIPTS.
加载代码最终目标是:用户打开 workbook,运行s 来自 MyMenu > Form
的项目,打开 modal/form;用户写下他的信息并点击提交。之后,来自 SCRIPTS 的函数 saveData
会将信息写入电子表格 requests.
Obs.: 由于saveData
需要调用 SCRIPTS 项目中托管的 2 个方法,它也需要在同一项目中托管。
脚本:https://docs.google.com/spreadsheets/d/1Dkntw25H41JTk0R3Rm9fgiwt_RrAee9zYEz1Wy8DomI/edit?usp=sharing 请求:https://docs.google.com/spreadsheets/d/1o8JbVelmSNoGn6sn7laatBam_2WTtToB_nlZMTFY_Rg/edit?usp=sharing 工作簿:https://docs.google.com/spreadsheets/d/17plSc9-kPj6XMBENBLJEE6sc01i82xfhGGPQ1UmOXjE/edit?usp=sharing
这里的问题是,在我上面分享的电子表格上,一切都完美无缺,但在我需要处理的原始电子表格上(那里有我工作中的敏感数据,我无法分享 url),当我点击按钮 submit
时,我只在控制台上收到此错误,但没有任何效果:
PS.: 虽然我不能分享我工作的电子表格,但是所有的代码,从工作簿中的代码到脚本电子表格中的代码都和我一模一样为我的工作写的,就像我在这里说的那样使用不同的电子表格,但我仍然收到以下错误:
一些可能对您有帮助的代码:
项目:工作簿
// Code.gs
function onOpen() {
SpreadsheetApp.getUi().createMenu('MyMenu').addItem('Form', 'closeKits').addToUi();
}
// CloseKits.gs
function closeKits() {
scripts.showForm();
}
function callLibraryFunction(data){
scripts.saveData(data);
}
appsscript.json
{
"timeZone": "America/New_York",
"dependencies": {
"libraries": [
{
"userSymbol": "scripts",
"version": "0",
"libraryId": "1AhbUglj05OrQuaZFqQcL_0UB7MCGope2YpVnE7eOGYjdxiXug0DiDA1i",
"developmentMode": true
}
]
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
项目脚本:
<!-- Form.html -->
<!DOCTYPE html>
<html>
<head>
<!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<!--Import materialize.css-->
<!-- Compiled and minified CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!--Let browser know website is optimized for mobile-->
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<div class="container">
<form class="col s12">
<div class="row">
<label for="requestedBy">Requested By</label>
<input id="requestedBy" type="text" placeholder="John Doe" class="validate">
</div>
<div class="row">
<label for="dueDate">Due Date</label>
<input id="dueDate" class="datepicker">
</div>
<div class="row">
<label for="comments">Comments</label>
<textarea id="comments" placeholder="Please ignore lines X, Y and Z..." class="materialize-textarea"></textarea>
</div>
<div class="row">
<button class="btn waves-effect waves-light" id="btn">
Submit
</button>
</div>
</form>
</div>
<!-- Compiled and minified JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
var options = {
autoClose: true,
format: 'mm/dd/yyyy',
defaultDate: new Date(),
setDefaultDate: true,
showClearBtn: true
};
document.addEventListener('DOMContentLoaded', function() {
var elements = document.querySelectorAll('.datepicker');
var instances = M.Datepicker.init(elements, options);
});
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.callLibraryFunction(data);
}
</script>
</body>
</html>
这里我不得不使用 workbook 中 Code.gs
中的 callLibraryFunction
来调用库函数 saveData
,因为HTML 客户端 运行ning 在 workbook.
// SaveData.gs
function saveData(data) {
const iasRequestsSpreadsheet = SpreadsheetApp.openById('1o8JbVelmSNoGn6sn7laatBam_2WTtToB_nlZMTFY_Rg');
const sheet = iasRequestsSpreadsheet.getSheetByName('page1');
const line = getFirstEmptyRow(sheet);
// requested by
sheet.getRange(line, 2).setValue(data.requestedBy);
// due date
sheet.getRange(line, 6).setValue(data.dueDate);
// comments
sheet.getRange(line, 9).setValue(data.comments);
}
// ShowForm.gs
function showForm() {
const form = HtmlService.createTemplateFromFile('Form').evaluate().setHeight(480);
SpreadsheetApp.getUi().showModalDialog(form, 'Form');
}
// GetFirstEmptyRow.gs
function getFirstEmptyRow(sheet) {
const column = sheet.getDataRange();
const values = column.getValues();
let row = 0;
for (row; row<values.length; row++) {
if (!values[row].join("")) {
break;
}
}
return (row+1);
}
请随时询问任何其他信息以解决此问题,并访问这些电子表格和 运行 一旦 工作簿 中的 onOpen
,因此它向您请求所需的权限。
编辑:
正如所问,点击 submit
后,在电子表格 workbook
上,我在日志中只得到了这个:
好吧,显然这是浏览器的问题...在我的工作笔记本上,它使用边缘工作,而对于我的同事,它在 chrome 和边缘上工作。但是我还是不知道这里的不兼容是什么。