谷歌appscript表单显示用户选择的数组值

时间:2015-09-03 18:50:56

标签: javascript html google-apps-script

我不确定如何编写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;
}

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。

希望这有帮助。