我不确定如何编写GAS表单按钮以使用动态值触发脚本。 在此方案中,当前工作表单元格值用于查找相邻工作表中的行并填充结果数组。 然后,表单将显示一个按钮列表,其中包含来自结果数组的一列的值。 按表单按钮应触发脚本postLocationData,并使用结果数组值更新行中的当前单元格和相邻单元格,然后关闭表单。此时,按下表单按钮似乎没有做任何事情。非常感谢您的帮助:)
function lookUpLocationTest(){
var ui = SpreadsheetApp.getUi();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = sheet.getActiveCell();
var sheetLocations = ss.getSheetByName('LU_Locations');
var arrayRecords = sheetLocations.getRange(2, 3, sheetLocations.getLastRow(), 2).getValues();
var matchingLocations=[];
for (var i=0;i<arrayRecords.length;i++) {
var result = arrayRecords[i][1].indexOf(cell.getValue())
if(result !== -1) {
matchingLocations.push(arrayRecords[i]);
}
}
if(matchingLocations.length === 0){
var result = ui.alert(
'Message:',
'No Matching Location Found.',
ui.ButtonSet.OK);
return 0;
}
Logger.log(' Process - ' + matchingLocations.length + ' Locations have been found.') ; //matchingLocations is a global
// Prep Form HTML with formatted matching Locations
var HTML= '<form><div>'
for(var i=0;i<matchingLocations.length;i++){
HTML += "<div><input type='button' value='" + matchingLocations[i][1]
+ "' onclick='google.script.run.withSuccessHandler(postLocationData).processForm(this.parentNode)'/></div>";
}
var htmlOutput = HtmlService.createHtmlOutput(HTML).setSandboxMode(HtmlService.SandboxMode.IFRAME);
var result = SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Matching Locations');
return 1;
}
function postLocationData(lookUpValue) {
var location = lookUpValuesInArray (matchingLocations, 1, lookUpValue); //matchingLocations is a global
var cell = currCell;
var latLongCol = 3;
cell.setValue(location[0][1]);
cell.getRowIndex();
var sheet = cell.getSheet();
sheet.getRange(cell.getRowIndex(), latLongCol).setValue(location[0][0]);
var temp =1;
}
答案 0 :(得分:1)
功能&#34; google.script.run
&#34;将在客户端执行,但它将调用服务器端的一个函数(您的.gs文件)。在这种情况下,您将调用的函数是&#34; processForm()&#34;你发送的地方&#34; this.parentNode&#34;作为参数。
在你的应用程序脚本文件(gs文件)中,你应该有一个名为&#34; processForm()&#34;的函数。你没有在示例中发布它。
此功能结束后,如果一切顺利,功能&#34; google.script.run
&#34;将执行您在&#34; withSuccessHandler()
&#34;中定义的功能。在您的示例中,您使用了&#34; postLocationData&#34;。
此函数将接收执行processForm()返回的结果作为参数。
正如我之前提到的那样,在客户端调用google.script.run
,因此如果一切顺利(包含在withSuccessHandler中的那个),将执行的函数也必须在客户端。这意味着它必须是HTML中包含的脚本的一部分。
按照您发布代码的方式,我会将onclick更改为:
onclick='google.script.run.withSuccessHandler(someJavascriptFunction).postLocationData(this.parentNode)
withSuccessHandler是可选的,如果您决定使用它,那么您应该在HTML变量中创建一个html脚本标记,该变量具有该javascript函数以显示警告或告诉用户单击按钮的结果。
您还可以在appsscript项目中创建一个html文件,并将其命名为:HtmlService.createHtmlOutputFromFile('Index').setSandboxMode(HtmlService.SandboxMode.IFRAME);
通过这种方式,您可以拥有更清晰的html文件以及与之相关的javascript。
希望这有帮助。