Javascript Google脚本Web应用程序未使用数据填充Googlesheet
我正在开发一个从Packt上下载的谷歌时钟应用程序。我不能让它工作。有一个HTML文件和一个.gs。我认为HTML中的javascript不起作用。要么是那样,要么是.gs代码中的doGet函数。我真的不知道。我尝试过将其切碎并隔离错误,我认为可能是HTML没有运行javascript 这是相应文档的代码 代码.gsJavascript Google脚本Web应用程序未使用数据填充Googlesheet,javascript,html,google-apps-script,google-sheets,Javascript,Html,Google Apps Script,Google Sheets,我正在开发一个从Packt上下载的谷歌时钟应用程序。我不能让它工作。有一个HTML文件和一个.gs。我认为HTML中的javascript不起作用。要么是那样,要么是.gs代码中的doGet函数。我真的不知道。我尝试过将其切碎并隔离错误,我认为可能是HTML没有运行javascript 这是相应文档的代码 代码.gs var ssid = "1BMb3P0G0nqYHfLrDGS113_CJ-pQx0x0QHrihnalaufk"; // Change date format as per y
var ssid = "1BMb3P0G0nqYHfLrDGS113_CJ-pQx0x0QHrihnalaufk";
// Change date format as per your preference.
var DF = "MM/dd/yyyy HH:mm:ss";
var TZ = Session.getScriptTimeZone();
var ss = SpreadsheetApp.openById(ssid);
var TimeSheet = ss.getSheetByName("TimeSheet");
var EmpSheet = ss.getSheetByName("EmployeesList");
var BackupSheet = ss.getSheetByName("Backup");
var MessageSheet = ss.getSheetByName("Message");
/**
* Get employee names from the EmployeesList sheet,
* construct the data as an array and return.
*
*/
function getEmpList(){
var emp = [];
var data = EmpSheet.getDataRange().getValues();
for(var i in data) if(data[i][0]) emp.push(data[i][0]);
return emp;
}
function doGet(){
var template = HtmlService.createTemplateFromFile("Timesheet");
template.message = MessageSheet.getRange("A2").getValue();
template.empList = getEmpList();
var html = template.evaluate();
return html;
}
// Returns employee shift status as an array [status, name].
function getEmpStatus(emp){
var empData = EmpSheet.getDataRange().getValues();
var timeData = TimeSheet.getDataRange().getValues();
// Remove header
timeData.shift();
for(var i in timeData){
if(timeData[i][1] == emp)
return [timeData[i][0],empData[j][1]];
}
// Return null if employee not in shift
return ["",""];
}
function fmtDate_(d, format) {
// Set the default date format, if 'format' not passed.
var fmt = format || "MM/dd/yyyy HH:mm:ss";
var timeZone = Session.getScriptTimeZone();
return Utilities.formatDate(d, timeZone, fmt);
}
function postTime(name, val) {
var time = fmtDate_(new Date());
var data = TimeSheet.getDataRange().getValues();
// If 'shift start' clicked
if (val == "sb") {
// Update start time if clicked again.
for (var i in data) {
if (data[i][1] == name && data[i][0] == "sb") {
data[i][2] = time;
TimeSheet.getRange(1, 1, data.length, data[0].length)
.setValues(data);
return [val, name];
}
};
// Else insert new name and update start time.
TimeSheet.appendRow([val, name, time]);
return [val, name];
}
// If 'break start' clicked.
if(val == "bb"){
for(var i in data){
// Update break start time only if employee is in shift.
if(data[i][0] == "sb" && data[i][1] == name ){
data[i][0] = val;
data[i][3] = time;
TimeSheet.getRange(1, 1, data.length, data[0].length)
.setValues(data);
return [val,name];
}
};
// If 'break start' clicked before 'shift start'.
throw "Please start your shift.";
}
// If 'break end' clicked
if(val == "be"){
for(var i in data){
if(data[i][0] == "bb" && data[i][1] == name ){
data[i][0] = val;
data[i][4] = time;
TimeSheet.getRange(1, 1, data.length, data[0].length)
.setValues(data);
return [val,name];
}
};
// If 'break end' clicked before 'break start'.
throw "Please start your break.";
}
// If shift end clicked
if(val == "se"){
for(var i in data){
if(data[i][1] == name
&& (data[i][0] == "sb"|| data[i][0] == "be") ){
var backup = [];
backup.push(
data[i][1], // Name
data[i][2], // Shift Start
data[i][3], // Break Start
data[i][4], // Break End
time, // Shift end
'=(E2-B2)*24', // Col F formula,
'=(D2-C2)*24', // Col G formula
'=F2-G2' // Col H formula
);
/*
* Copy Timesheet data to Backup sheet.
* Insert a new row before row 2,
* so that the inserted formulas ever work.
*
*/
BackupSheet.insertRowBefore(2);
BackupSheet.getRange(2, 1, 1, backup.length)
.setValues([backup]);
/*
* Tidy timesheet.
* Ensure at least one data row before deleting,
* to avoid error.
*
*/
if(i<2) TimeSheet.appendRow(['']);
// Delete copied row
TimeSheet.deleteRow(Number(i)+1);
return [val,name];
}
};
// If 'shift end' clicked before 'break end'.
if(data[i][0] == "bb")
throw "Please end your break.";
// If 'shift end' clicked without starting shift.
throw "Please start your shift.";
}
}
var ssid=“1BMb3P0G0nqYHfLrDGS113_CJ-PQX0x0QHRIHNAULUFK”;
//根据您的喜好更改日期格式。
var DF=“MM/dd/yyyy HH:MM:ss”;
var TZ=Session.getScriptTimeZone();
var ss=电子表格应用程序openById(ssid);
var TimeSheet=ss.getSheetByName(“时间表”);
var EmpSheet=ss.getSheetByName(“员工列表”);
var BackupSheet=ss.getSheetByName(“备份”);
var MessageSheet=ss.getSheetByName(“消息”);
/**
*从员工列表中获取员工姓名,
*将数据构造为数组并返回。
*
*/
函数getEmpList(){
var-emp=[];
var data=EmpSheet.getDataRange().getValues();
对于(数据中的var i)if(数据[i][0])emp.push(数据[i][0]);
返回emp;
}
函数doGet(){
var template=HtmlService.createTemplateFromFile(“时间表”);
template.message=MessageSheet.getRange(“A2”).getValue();
template.empList=getEmpList();
var html=template.evaluate();
返回html;
}
//将员工轮班状态返回为数组[状态,名称]。
函数getEmpStatus(emp){
var empData=EmpSheet.getDataRange().getValues();
var timeData=TimeSheet.getDataRange().getValues();
//卸下收割台
timeData.shift();
用于(时间数据中的var i){
如果(时间数据[i][1]==emp)
返回[timeData[i][0],empData[j][1];
}
//如果员工未轮班,则返回null
返回[“”,“”];
}
函数fmtDate_ud(格式){
//如果未传递“格式”,则设置默认日期格式。
var fmt=格式| |“MM/dd/yyyy HH:MM:ss”;
var timeZone=Session.getScriptTimeZone();
返回实用程序.formatDate(d,时区,fmt);
}
函数postTime(名称,val){
var time=fmtDate(新日期());
var data=TimeSheet.getDataRange().getValues();
//如果单击了“班次开始”
如果(val=“sb”){
//如果再次单击,则更新开始时间。
用于(数据中的var i){
如果(数据[i][1]==名称和数据[i][0]==“sb”){
数据[i][2]=时间;
TimeSheet.getRange(1,1,data.length,data[0].length)
.设定值(数据);
返回[val,name];
}
};
//否则,请插入新名称并更新开始时间。
时间表.appendRow([val,name,time]);
返回[val,name];
}
//如果单击“中断开始”。
如果(val=“bb”){
用于(数据中的var i){
//仅当员工轮班时更新休息开始时间。
if(数据[i][0]==“sb”&&data[i][1]==名称){
数据[i][0]=val;
数据[i][3]=时间;
TimeSheet.getRange(1,1,data.length,data[0].length)
.设定值(数据);
返回[val,name];
}
};
//如果在“班次开始”之前单击了“中断开始”。
抛出“请开始轮班”;
}
//如果单击“中断结束”
如果(val==“be”){
用于(数据中的var i){
if(数据[i][0]==“bb”&&data[i][1]==名称){
数据[i][0]=val;
数据[i][4]=时间;
TimeSheet.getRange(1,1,data.length,data[0].length)
.设定值(数据);
返回[val,name];
}
};
//如果在“中断开始”之前单击“中断结束”。
抛出“请开始休息”;
}
//如果按住shift键并单击“结束”
如果(val=“se”){
用于(数据中的var i){
如果(数据[i][1]==名称
&&(数据[i][0]=“sb”|数据[i][0]=“be”)){
var备份=[];
backup.push(
数据[i][1],//名称
数据[i][2],//班次开始
数据[i][3],//中断-启动
数据[i][4],//中断结束
时间,//班次结束
“=(E2-B2)*24',//列F公式,
“=(D2-C2)*24',//列G公式
'=F2-G2'//H列公式
);
/*
*将时间表数据复制到备份工作表。
*在第2行之前插入新行,
*这样插入的公式就可以工作了。
*
*/
背面纸张。插入行之前(2);
BackupSheet.getRange(2,1,1,backup.length)
.setValues([backup]);
/*
*整洁的时间表。
*确保删除前至少有一个数据行,
*以避免错误。
*
*/
如果(i)
工时表
最基本的问题..你试图写入的文件是公开的吗?我不这么认为。你看过这个吗?可能是你要问的:)而且,它可能必须是公开的。我知道有些条款与写入Google Drive文档有关,比如不要切碎。调试的第一步是从头开始(只添加查看错误所需的内容)。请参阅。引用错误。最基本的问题..您试图写入的文件是否为公共文件?我不这么认为。您看过这个吗?可能是您要问的:)此外,它可能必须是公开的。我知道有一些条款与写入谷歌驱动器文档有关,比如不要切掉。调试的第一步是从头开始(只添加查看错误所需的内容)。请参阅。引用错误。
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css" />
<script src= "https://ajax.googleapis.com/ajax/libs /jquery/1.10.1/jquery.min.js"></script>
</head>
<body>
<div>
<fieldset style="padding-bottom:25px;">
<legend>Timesheet</legend>
<select id="employee" name="employee">
<? for(var i in empList){ ?>
<option value="<?= empList[i] ?>" > <?= empList[i] ?></option>
<? } ?>
</select>
<br /><br />
<button id="sb" value="sb"><span>Shift Start</span></button>
<button id="bb" value="bb"><span>Break Start</span></button>
<button id="be" value="be"><span>Break End</span></button>
<button id="se" value="se"><span>Shift End</span></button>
</fieldset>
<fieldset>
<div id="message"><?!= message ?></div>
</fieldset>
</div>
<script>
$(function() {
// Disable all buttons.
$('#sb,#bb,#be,#se').prop("disabled", true);
// Set drop-down change event.
$('#employee').change(getStatus);
// Set buttons click event.
$('#sb,#bb,#be,#se').click(postTime);
getStatus();
});
function getStatus(){
// Remove all previous error messages.
$('#error,#success').remove();
// Disable all buttons.
$('#sb,#bb,#be,#se').prop("disabled", true);
// Get employee shift status.
google.script.run
.withSuccessHandler(function(status){
updateStatus(status);
})
.getEmpStatus($("#employee").val());
}
function postTime(){
// Remove all previous error messages.
$('#error,#success').remove();
// Disable all buttons.
$('#sb,#bb,#be,#se').prop("disabled", true);
// Post shift time to sheet.
google.script.run
.withSuccessHandler(function(msg){
updateStatus(msg[0]);
})
.withFailureHandler(function(msg, elm){
showError(msg, elm);
})
.withUserObject(this)
.postTime($("#employee").val(),$(this).val());
}
function updateStatus(status){
// Enable appropriate buttons only.
switch(status){
case "sb": $('#bb,#se').prop("disabled", false); break;
case "bb": $('#be').prop("disabled", false); break;
case "be": $('#se').prop("disabled", false); break;
default: $('#sb').prop("disabled", false);
}
}
function showError(msg, elm) {
var span = $('<span id="error" class="error">' + msg + '</span>');
$(elm).after(span);
}
</script>
</body>
</html>