如何在Google Spreadsheet工作簿中创建所有工作表的侧边栏列表?

时间:2019-12-15 11:55:31

标签: google-apps-script google-sheets

由于我的Google电子表格工作簿包含太多工作表,因此在电子表格工作簿左下角的下拉菜单中都看不到它们,因此我尝试通过以下方式修改“ How to get the list of all sheet in a dropdown list in a sidebar”中的代码独立脚本到绑定脚本,以便能够看到更长的列表。另外,我不希望我的列表出现在下拉列表中。我只希望将其作为项目符号列表。

我收到一个格式错误的HTML错误,我认为该错误是从片段中生成的。 (请参见下面的代码。)任何想法,此代码出了什么问题。

HTML

<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <select name="Sheets List" onchange="listSheets()")>
    <? var sheets=spreadsheet.getSheets(); ?>
    <? for(var i=0;i<sheets.length;i++) { ?>
      <option value=<?=sheets[i].getName()?>> <?= sheets[i].getName()?></option>
    <? } ?>
    </select>
  <script>
   function listSheets(){
     var name=document.getElementsByName("Sheets List")[0].value;
     google.script.run.goToSheet(name);
    };
  </script>
  </body>
  </html>

GS

function onOpen() {
   var ui = SpreadsheetApp.getUi();
   ui.createMenu('Custom')
      .addItem('Sheets List', 'sheetsList')   
      .addToUi();

function sheetsList(){
  var html = HtmlService.createHtmlOutputFromFile('sheets').evaluate
      .setTitle('Sheets in this Workbook')
      .setWidth(300);
  SpreadsheetApp.getUi()
  .showSidebar(html);
}
}

错误消息

消息详细信息 格式错误的HTML内容:>函数listSheets(){var name = document.getElementsByName(“ Sheets List”)[0] .value; google.script.run.goToSheet(name); };

3 个答案:

答案 0 :(得分:1)

您遇到了一些阻止侧边栏显示的问题:

  1. 您应该使用HtmlService.createTemplateFromFile(),而不是createHtmlOutputFromFile()
  2. 要生成HTML,您需要在调用.evaluate()时包括括号。 (与第一点有关,请注意evaluate()仅适用于HtmlTemplate对象。)
  3. sheetsList()不应嵌套在onOpen()函数中。
  4. 您需要在HTML中定义spreadsheet

GS

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Custom')
  .addItem('Sheets List', 'sheetsList')   
  .addToUi();
}

function sheetsList(){
  var html = HtmlService.createTemplateFromFile('sheets').evaluate()
    .setTitle('Sheets in this Workbook')
    .setWidth(300);
  SpreadsheetApp.getUi().showSidebar(html);
}

HTML 在下面的HTML中,我删除了listSheets()的前端JS代码,因为它不是问题范围的一部分,并且正在调用也不包含在问题中的后端函数。 < / p>

<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <select name="Sheets List">
      <? var spreadsheet = SpreadsheetApp.getActive(); ?>
      <? var sheets=spreadsheet.getSheets(); ?>
      <? for(var i=0;i<sheets.length;i++) { ?>
      <option value=<?=sheets[i].getName()?>> <?= sheets[i].getName()?></option>
      <? } ?>
    </select>
  </body>
</html>

答案 1 :(得分:1)

侧边栏中的页面链接列表

https://api.instagram.com/oauth/authorize/?client_id=[MY CLIENTID!!!]&redirect_uri=[MY URL!!!]&response_type=code

您可以通过这种方式在侧栏上获得更多按钮:

function allsheetslist() {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  var html='<table>';
  shts.forEach(function(sh,i){
    html+=Utilities.formatString('<tr><td><input type="button" value="%s" onClick="gotoSheet(%s);" /></td></tr>',sh.getName(),sh.getIndex());
  });
  html+='</table>';
  html+='<script>function gotoSheet(index){google.script.run.gotoSheetIndex(index);}</script>';
  var userInterface=HtmlService.createHtmlOutput(html)
  SpreadsheetApp.getUi().showSidebar(userInterface);
}

function gotoSheetIndex(index) {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  shts[index-1].activate();
}

答案 2 :(得分:0)

尝试了@Cooper方式。它对我来说更轻松,更友好。但是仍然悬而未决的问题是,没有调用“ OnClick”功能,并且在侧栏上单击工作表名称按钮时没有任何反应。我什至还添加了一个要在边栏中与工作表名称一起显示的特定字段。那很棒。现在,唯一需要的帮助就是激活点击。我尝试了许多方法,但仍然没有成功。使用的代码如下:

function allsheetsList() {
  var ss = SpreadsheetApp.getActive();
  var shts = ss.getSheets();
  var html = '<table>';
  shts.forEach(function(sh, i) {
    html += Utilities.formatString('<tr><td><input type="button" value="%s" onClick="google.script.run.gotoSheet(\'%s\');" /></td>', sh.getName(), sh.getName());
    html += Utilities.formatString('<td><input type="button" value="%s" /></td></tr>', sh.getRange("C2").getValue());
  });
  html += '</table>';
  var userInterface = HtmlService.createHtmlOutput(html).setTitle("Sheet Link List");
  SpreadsheetApp.getUi().showSidebar(userInterface);
}

function gotoSheet(name) {
  var ss = SpreadsheetApp.getActive();
  ss.getSheetByName(name).activate();
}