自动切换工作表/标签的脚本

时间:2019-06-12 03:12:20

标签: google-apps-script google-sheets

我有一个带有标签(分别为0、1、2、3、4)的Google表格,其中包含图表和表格。

我正在尝试创建一个应用程序脚本,以便在X分钟后在这些选项卡之间切换,因此我可以使用它并将其作为动态仪表板显示在电视上。

我编写了脚本,如果我通过脚本编辑器运行,它将可以正常工作。我还创建了一个计时器触发器来调用此函数,但是此触发器无法正常工作。有人有任何线索吗?

function switchTabs() {

  var sheet_number = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
  var next_sheet_number = parseInt(sheet_number) + 1;
  if(next_sheet_number>4){ next_sheet_number = 0; }
  var activate = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(next_sheet_number).activate();

}

2 个答案:

答案 0 :(得分:2)

图纸展示

这是一个脚本,可创建一张幻灯片,就像一张幻灯片,仅包含图纸而不是幻灯片。边栏允许您设置图纸之间的时间。就您而言,您只需使用两张纸即可,然后您将需要进行切换。

codes.gs:

function onOpen()
{
  SpreadsheetApp.getUi().createMenu('G+ Script Problems')
      .addItem('showSheets', 'showSheet')
      .addItem('Sheet Show Sidebar', 'SheetShowSidebar')
      .addToUi();
}

SheetShowDialog.html:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <style>
      #my_block{border:2px solid black;background-color:rgba(0,150,255,0.2);padding:10px 10px 10px 10px;}
      #conv_block{border: 1px solid black;padding:10px 10px 10px 10px;}
      .bttn_block{padding:5px 5px 0px 0px;}
      .sndr_block {border:1px solid rgba(0,150,0,0.5);background-color:rgba(150,150,0,0.2);margin-bottom:2px;}
    </style>
  </head>
  <body>
  <form>
    <div id="my_block" class="block form-group">
      <div class="sndr_block">
        <strong>Show Info:</strong>
        <br />Sheets in Show:
        <br /><div id="shtsinfo1"><input id="txt1" type="text" size="4" class="action"/></div>
        <br />Sheet Name:
        <br /><input id="txt4" type="text" size="20" class="action"/>
        <br />Sheet Number:
        <br /><input id="txt3" type="text" size="4" class="action"/>
        <br />Sheet Delay(seconds):
        <br /><input id="txt2" type="text" size="4" class="action"/>
        <select id="sel1" onChange="loadTxt('sel1','txt2');">
          <option value="5">5</option>
          <option value="10" selected>10</option>
          <option value="15">15</option>
          <option value="20">20</option>
          <option value="25">25</option>
          <option value="30">30</option>
          <option value="35">35</option>
          <option value="40">40</option>
          <option value="45">45</option>
          <option value="50">50</option>
        </select>
        <br /><strong>Timer Controls</strong>
        <div class="bttn_block"><input type="button" value="Start" name="startShow" id="startShow" onClick="startmytimer();" class="red" /></div>
        <div class="bttn_block"><input type="button" value="Stop" name="stopTimer" id="stopTimer" class="red" /></div>
        <div class="bttn_block"><input type="button" value="Step" name="step1" id="step1" onClick="mystep(0);" class="action" /></div>
      </div>
      <div id="btn-bar">
        <br /><input type="button" value="Exit" onClick="google.script.host.close();" class="green" />
      </div>
    </div>
  </form>
     <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
    </script>
    <script>
    var idx=1;
    var myInterval='';
      $(function() {
        $('#startTimer').click(startmytimer);
        $('#stopTimer').click(stopTimer);
        $('#txt4').val('');
        $('#txt3').val('');
        $('#txt2').val(10);
        $('#txt1').val(5);
        google.script.run
           .withSuccessHandler(setTotal)
           .getTotalSheets();
      });

      function showSheet()
      {
        var maxidx = $('#txt1').val();
        if(idx>maxidx)idx=1;
        if(idx<=maxidx && idx>0)
        {
          google.script.run
            .withSuccessHandler(showStatus)
            .showSheet(idx);     
          idx += 1;
        }
      }

      function showStatus(r)   
      {
        if(r[0]>-1)
        {
          $('#txt3').val(r[0]);
          $('#txt4').val(r[1]);
        }
        else
        {
          $('#txt3').val('');
          $('#txt4').val(r[1]);
        }
      }

      function startmytimer()
      {
        showSheet();
        myInterval=setInterval(showSheet, Number($('#txt2').val())*1000);
        google.script.run.displayToast('Timer Started','Script Status', 5);
      }

      function stopTimer()
      {
        if(myInterval)
        {
          clearInterval(myInterval);
          google.script.run.displayToast('Timer Stopped','Script Status', 5);
        }
        else
        {
          google.script.run.displayToast('myInterval not set.','Script Status', 5);
        }
      }

      function loadTxt(from,to)
      {

          document.getElementById(to).value = document.getElementById(from).value;
      }

      function mystep(d)
      {
        idx+=d;
        showSheet();
      }

      function setTotal(n)
      {
        var s = '<select id="sel2" onChange="loadTxt(\'sel2\',\'txt1\');">';
        var n = (typeof(n)!='undefined')?n:0;
        var sel = $('#txt1').val();
        if(n>0)
        {

          for(var i=1;i<=n;i++)
          {
             var sltd = (i!=sel)?'':' selected'; 
             s+='<option value="' + i + '"' + sltd + '>' + i + '</option>';
          }
          s+='</select>';
          var el = document.getElementById('shtsinfo1').innerHTML += s;
          $('#txt1').val(sel);
        }
      }

     console.log('My Code');
   </script>
  </body>
</html>

SheetShow.gs:

function showSheet(idx)
{
  var idx = (typeof(idx)!='undefined')?idx:1;
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  if(idx>0 && idx<=sheets.length)
  {
    var sht=sheets[idx-1];
    sht.activate();
    var r = [idx,sht.getName()];
    return r;
  }
  else
  {
    var r = [-1,'Index out of range.'];
    return r;
  }
}

function SheetShowSidebar()
{
  var ui = HtmlService.createHtmlOutputFromFile('SheetShowDialog').setTitle('Sheet Show Info:');
  SpreadsheetApp.getUi().showSidebar(ui);
}

function displayToast(msg,title,timeoutSeconds)
{
  SpreadsheetApp.getActiveSpreadsheet().toast(msg, title, timeoutSeconds)
}

function getTotalSheets()
{
  return SpreadsheetApp.getActiveSpreadsheet().getSheets().length;
}

答案 1 :(得分:0)

我喜欢库珀的答案,但找不到一种方法来隐藏侧边栏,同时又不影响工作表的显示。我正在使用Chrome Cast在电视上显示表格,因此边栏也可以在电视上看到。我发现另一个适用于我的情况的解决方案是Chrome加载项,该加载项会按设置的时间间隔在各个标签之间循环显示。我在多个Chrome标签中打开Goog​​le表格,每个标签显示一个不同的表格以及它们之间的加载周期。

我发现效果最好的加载项是Tabs SlideShow by FredZvt。这只会循环运行该窗口的标签页,并且不会影响其他Chrome窗口,您可以独立设置每个标签页的时间或排除特定标签页,并且每次显示特定标签页时都可以自动重新加载。