我有一个日常工作日志,供我修理其设备的各个客户使用。此工作日志采用具有多个工作表的Google电子表格的形式,其中每个工作表都分配给特定的常规客户。我通过基于Google Apps脚本的手机,通过基本网络应用程序记录当前日期,工作设备和工作完成情况。
在我的开发环境中,我使用模态对话框“测试”弹出框,它完美无缺。我从下拉列表中选择客户,在文本字段中输入信息并单击“保存”,相关客户的工作表将填充数据。但是,当我发布或部署应用程序时,尽管从列表中选择了任何客户,但只会填充最左侧的工作表(sheet1)。不知何故,通过URL访问“服务器”电子表格会使“google.script.run”调用失效。有没有人有任何想法如何解决这个问题。在此提前感谢您提供任何帮助。
**Index.html**
<!DOCTYPE html>
<html lang='en'>
<head>
<base target="_top">
<meta charset="utf-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0,
maximum-scale=1.0">
</head>
<body>
<form>
<h1>Daily Work Record</h1>
<p><label class="question" for="customer">Customer: </label>
<select name="customer" id="customer" onchange
="customerSelect(this)"/>
<option></option>
<option value="1">Customer A</option>
<option value="2">Customer B</option>
<option value="3">Customer C</option>
</select></p>
<p><label class="question" for="equipment">Equipment: </label>
<select name="equipment" id="equipment">
<option>Toaster</option>
<option>Mixer</option>
<option>Blender</option>
<option>Slicer</option>
<option>Other</option>
</select></p>
<p><label class="question" for="work">Work Done: </label>
<input type="text" name="work" id="work" placeholder="enter work carried
out" size="25" /></p>
<input type="button" id="button" value="Save"
onclick="google.script.run
.withSuccessHandler(DataSaved)
.itemAdd(this.parentNode)"/>
</form>
<script>
function customerSelect(menu){
if(menu.value=='1'){
google.script.run.sheetOne();
} else if(menu.value=='2'){
google.script.run.sheetTwo();
} else if(menu.value=='3'){
google.script.run.sheetThree();
} else return false;
}
</script>
<div id="Message"></div>
<script>
function DataSaved(){
document.getElementById('Message').innerHTML="<span class='save'>Data
Saved</span>";
return;
}
</script>
</body>
**Code.gs**
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Test').addItem('PopUp', 'show').addToUi();
}
function show() {
var html = HtmlService.createHtmlOutputFromFile('Index')
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setHeight(800)
.setWidth(800)
SpreadsheetApp.getUi().showModalDialog(html, 'Enter Job Details');
}
function doGet() {
var html = HtmlService.createHtmlOutputFromFile('Index')
.setSandboxMode(HtmlService.SandboxMode.IFRAME);
return html;
}
function sheetOne() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Customer A");
sheet.getRange("A1").activate();//used instead of setActiveSheet
return true;
}
function sheetTwo() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Customer B");
sheet.getRange("A1").activate();
return true;
}
function sheetThree() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Customer C");
sheet.getRange("A1").activate();
return true;
}
function itemAdd(form) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
sheet.appendRow([Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd"),
form.equipment, form.work]);
return true;
}
答案 0 :(得分:0)
我会使用不同的策略。我不会尝试预先设置活动表。因此,您不需要SELECT标记中的function itemAdd(form) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetToValue = {//Object literal mapping user answer to sheet tab name
"Customer A":"Customer A",
"Customer B":"Customer B",
"Customer C":"Customer C"
}
var whichSheetToGet = sheetToValue[form.customer];
var sheet = ss.getSheetByName(whichSheetToGet);//Get sheet tab
sheet.appendRow([Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd"),
form.equipment, form.work]);
return true;
}
函数。
{{1}}
您也不需要任何功能:
更改{{1}}功能以按名称获取工作表标签
{{1}}