我一直在使用Google Apps脚本HtmlService的应用程序上工作,因此可以用HTML创建UI。该应用程序运行与OnEdit函数共享的一些代码,并且根据我在哪里运行代码,我需要传递不同的参数。因此,我需要检测代码是直接从电子表格还是从HtmlService UI初始化的。
我尝试根据活动电子表格设置参数,但是如果这样做,我只能使用特定工作表中的UI-如果我从其他任何工作中使用UI,则会发生。
下面是代码示例(未声明的变量在其他地方声明):
function loanHistory(input){
for(var i = 6; i >= 4; i--){
var currentCell = loanHistorySheet.getRange(deviceRow, i)
var valueToMove = currentCell.getValue();
loanHistorySheet.getRange(deviceRow, i).offset(0, 1).setValue(valueToMove);
currentCell.clearContent();
}
var currentlyBorrowed;
if(activeSheet.getName() === 'Borrow/Hand in') {
currentlyBorrowed = input;
} else {
currentlyBorrowed = input.value;
}
loanHistorySheet.getRange(deviceRow, 4).setValue(currentlyBorrowed);
}
在此示例中,我希望使用类似“ isHtmlServiceRunning”的东西,而不是“ activeSheet.getName()===”借用/交手”。
有什么方法可以检测HtmlService UI是否打开以防止意外代码运行?否则,我可能只需要完全分离代码即可。
希望我明确提出了挑战-感谢任何可以提供帮助的人!
答案 0 :(得分:0)
您的执行函数无法明确确定要调用其来源的Apps脚本。一种重要的简单方法,就是将您的功能分为接口和实现。
在HtmlService
中,只能访问项目中的“公共” Apps脚本功能。任何"private" function都不能直接调用,但是如果有公共方法可以调用它,则仍然可以访问它。
因此,如果您的原始脚本是这样的:
function onEdit(e) {
if (e) {
doTheThing(e.value);
}
}
function doTheThing(inputVal) {
/** do stuff */
}
,并且您的HtmlService
用户界面直接调用doTheThing
,即google.script.run.doTheThing(someVar);
,您可以按以下方式实现这种分离:
function onEdit(e) {
if (e) {
actualDoTheThing_(e.value);
}
}
function doTheThing(argFromHtmlService) {
var realArg = < .... >;
actualDoTheThing_(realArg);
}
function actualDoTheThing_(inputVal) {
/** do stuff */
}
,您的HtmlService
UI无需更改-您仍将执行google.script.run.doTheThing(someVar);
。但是,在服务器端,您已将实现与接口分离,因此可以将调用的源传递给实现。
如果realArg
的计算也应从HtmlService
UI中的调试中隐藏起来,则可以改为发送附加参数并在实现中进行检查:
function onEdit(e) {
if (e) {
actualDoTheThing_(e.value);
}
}
function doTheThing(argFromHtmlService) {
actualDoTheThing_(argFromHtmlService, true);
}
function actualDoTheThing_(inputVal, cameFromHtmlService) {
if (cameFromHtmlService === true) {
inputVal = < .... >;
}
/** do stuff */
}