在 Google 表格边栏中创建搜索

Creating a search in Google Sheets Sidebar

我有一个 sheet 可以跟踪大约 1400 个停车 spaces 并且想在边栏中添加一个单独的搜索。我已经能够通过自定义菜单点击显示侧边栏。在边栏中,我已经能够重命名它,添加一个搜索栏,并在栏下方添加搜索和关闭按钮。

我现在需要帮助,一旦用户在搜索栏中输入 space 号码并单击“搜索”,它将获取 space 号码,查看 B 列并收集以下信息从该行和 return 到以下格式的边栏:

下面是我现在拥有的代码。

Menu.gs

function onOpen() { 

SpreadsheetApp.getUi()
.createMenu('Sidebar')
.addItem('Show Sidebar', 'showSidebar')
.addToUi(); 
}

Sidebar.gs

function showSidebar() {
var html = HtmlService.createHtmlOutputFromFile('index')
  .setSandboxMode(HtmlService.SandboxMode.IFRAME)
  .setTitle('Individual Space Lookup');
SpreadsheetApp.getUi()
  .showSidebar(html);
}

function searchInfo() {

return ('test');    

}

index.html

<div>

Search Individual Space: <input type="search" />

<BR>

<input type="button" value="Search"
onclick="google.script.run.onSuccess()" />

<input type="button" value="Close"
onclick="google.script.host.close()" />

<script> 

function onSuccess(searchInfo) {

alert('Column B: ' + searchInfoColB
    <br>'Column C: ' + searchInfoColC
    <br>'Column D: ' + searchInfoColD
    <br>'Column E: ' + searchInfoColE
    <br>'Column F: ' + searchInfoColF
    <br>'Column G: ' + searchInfoColG
    <br>'Row Number: ' + searchInfoRowNum

    );
}

google.script.run.withSuccessHandler(onSuccess)
  .searchInfo(); 

</script>
</div>

您的第一个输入标签应该有一个 "id" 属性。这是为了检索输入值。

Search Individual Space: <input type="search" id="idUserInput"/>

您的按钮输入标签配置错误。你有:

<input type="button" value="Search"
  onclick="google.script.run.onSuccess()" />

应该是:

<input type="button" value="Search"
  onclick="myFunction()" />

您有一个带有 onSuccess 函数的 SCRIPT 标记,然后使用 google.script.run 调用 Google 服务器函数。现在,您正在两个地方调用服务器代码。

您的 SCRIPT 标签只有一个功能,需要两个:

<script>

  function onSuccess() {
    alert('Column B: ' + searchInfoColB
      <br>'Column C: ' + searchInfoColC
      <br>'Column D: ' + searchInfoColD
      <br>'Column E: ' + searchInfoColE
      <br>'Column F: ' + searchInfoColF
      <br>'Column G: ' + searchInfoColG
      <br>'Row Number: ' + searchInfoRowNum
    );
  };

  function myFunction() {
    //Get the space number out of the input field
    var theSpaceNumber = document.getElementById("idUserInput").value;

    google.script.run.withSuccessHandler(onSuccess)
      .searchInfo(theSpaceNumber); 
  };

</script>

将停车 Space 号码传递给 gs 函数

//Get the space number out of the input field
var theSpaceNumber = document.getElementById("idUserInput").value;

google.script.run.withSuccessHandler(onSuccess)
  .searchInfo(theSpaceNumber); 

以上代码用于您的 SCRIPT 标记中的客户端代码。添加行以从输入框中获取 space 数字,并将 theSpaceNumber 变量放入函数调用中。 .searchInfo(theSpaceNumber);

以下是如何启动服务器端代码的概述:

获取您要访问的点差sheet的参考:

var ss = SpreadsheetApp.openById("theSpreadsheet ID");
//Logger.log(ss.getName());

获取对您需要访问的 sheet 的引用:

var sheetWithData = ss.getSheetByName("Sheet Name Here");

获取要经过的行数:

var numOfRowsInSheet = sheetWithData.getLastRow();

所以,到目前为止你会得到这个:

function searchInfo(argSpaceNumber) {
  var ss = SpreadsheetApp.openById("theSpreadsheet ID");
  //Logger.log(ss.getName());
  var sheetWithData = ss.getSheetByName("Sheet Name Here");
  var numOfRowsInSheet = sheetWithData.getLastRow();

  return ('test');    
};

现在您需要确定获取初始数据的最佳方式是什么。您是要获取一大块数据,还是逐个单元格地筛选数据?好吧,您需要的所有数据都在连续的列中,这样更容易。而且你只会得到一行数据,这样就更容易了。但问题是,什么parkingspace与什么行相关联?我假设您在 A 列中有停车 space 号码。因此您需要找到停车 space 号码所在的行号。

获取 A 列中的所有数据

var values = sheetWithData.getSheetValues(1, 1, numOfRowsInSheet, 1);
Logger.log(values);

在 A 列中找到 Space 数字

//Convert two dimensional array to one dimensional array.
var theRowValues = [];

for (var i = 0; i < values.length; i++) {
   theRowValues.push(values[i]);
};

var rowWithSpaceNumber = theRowValues.indexOf(argSpaceNumber.toString());
Logger.log("rowWithSpaceNumber: " + rowWithSpaceNumber);

获取行外的所有值

//Get 6 columns of data:  getSheetValues(startRow, startColumn, numRows, numColumns)
var theRowData = sheetWithData.getSheetValues(rowWithSpaceNumber, 2, 1, 6);

进行这些更改,测试和调试代码,如果有任何错误,post 另一个带有错误消息的问题,and/or 返回的结果和预期的结果。

使用 debug and/or Logger.log() 语句调试您的代码。