【问题标题】:Webapp button to duplicate sheet in google sheetsWebapp按钮在谷歌表格中复制表格
【发布时间】:2019-11-15 22:26:09
【问题描述】:

我正在尝试创建一个简单的 webapp 按钮,它将在 Google 表格中复制表格,我在 HTML 中创建了该按钮并链接它以在单击时运行代码!但它似乎不起作用!谁能告诉我我做错了什么?

<!DOCTYPE html>
<html>
 <head>
  <base target="_top">
 </head>
  <body>
  <button id="btn">Create</button> 
<script>
  document.getElementById("btn").addEventListener("click",doStuff);
  function doStuff(){
    google.script.run.userClicked();
  }
</script>
 </body>
  </html>

这里是复制代码:

function doGet() {
  return HtmlService.createHtmlOutputFromFile('page');
 }

   function userClicked() {
     SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet();
     var myValue = SpreadsheetApp.getActiveSheet().getRange("M1").getDisplayValue();
     SpreadsheetApp.getActiveSpreadsheet().renameActiveSheet("Daily Report " + myValue);
   }

【问题讨论】:

  • 在这种情况下,当您打开电子表格时,您将在服务器上打开它,因此活动工作表始终与 ss.getSheets()[0] 相同,它始终是最左侧的工作表。因此,最好使用 getSheetByName() 准确地确定您希望打开的工作表。

标签: dom google-apps-script google-sheets web-applications


【解决方案1】:

从 WebApp 复制和删除工作表

代码.gs:

function dupSheet(dObj) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.setActiveSheet(ss.getSheetByName(dObj.name));
  ss.duplicateActiveSheet();
  var name="Daily Report " + sh.getRange("A1").getDisplayValue();
  if(!sheetExists(name)) {
    ss.renameActiveSheet("Daily Report " + sh.getRange("A1").getDisplayValue());
  }
  dObj['sA']=getSheetNames().sA;
  return dObj;
}

function getSheetNames() {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  var sObj={sA:[]};
  shts.forEach(function(sh){
    sObj.sA.push(sh.getName());
  })
  return sObj;
}

function doGet() {
  return HtmlService.createHtmlOutputFromFile('dup');
}

function delSheet(dObj) {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName(dObj.name);
  ss.deleteSheet(sh);
  dObj['sA']=getSheetNames().sA;
  return dObj;
}

function sheetExists(name) {
  var ss=SpreadsheetApp.getActive();
  var sA=ss.getSheets();
  for(var i=0;i<sA.length;i++) {
    if(name==sA[i].getName()) {
      return true
    }
  }
  return false;
}

dup.html:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script>
    $(function(){
      google.script.run
      .withSuccessHandler(function(sObj){
        var select=document.getElementById('sel1');      
        sObj.sA.unshift('Please Select A File Name');
        select.options.length=0;
        for(var i=0;i<sObj.sA.length;i++) {
          select.options[i]=new Option(sObj.sA[i],sObj.sA[i]);
        }
      })
      .getSheetNames();

    });
    function dupSheet() {
      $("#sel1").css('background-color','#ffff00');
      google.script.run
      .withSuccessHandler(function(rObj){
        $('#sel1').css('background-color','#ffffff');
        var select=document.getElementById('sel1');      
        rObj.sA.unshift('Please Select A File Name');
        select.options.length=0;
        for(var i=0;i<rObj.sA.length;i++) {
          select.options[i]=new Option(rObj.sA[i],rObj.sA[i]);
        }
      })
      .dupSheet({name:$('#sel1').val()});
    }
    function delSheet() {
      $("#sel1").css('background-color','#ffff00');
      google.script.run
      .withSuccessHandler(function(rObj){
        $('#sel1').css('background-color','#ffffff');
        var select=document.getElementById('sel1');      
        rObj.sA.unshift('Please Select A File Name');
        select.options.length=0;
        for(var i=0;i<rObj.sA.length;i++) {
          select.options[i]=new Option(rObj.sA[i],rObj.sA[i]);
        }
      })
      .delSheet({name:$('#sel1').val()});
    }
  </script>
  <style>
  input{margin:2px 5px;}
  </style>
  </head>
  <body>
    <select id="sel1"></select><label for="sel1">Sheet Name</label>
    <br /><input type="button" value="Duplicate Sheet" onClick="dupSheet();" />
    <br /><input type="button" value="Delete Sheet" onClick="delSheet();" />
  </body>
</html>

我在那里也使用了一点 JQuery。

【讨论】:

  • 哇,库珀,这太棒了。非常感谢,我将查看代码和 HTML 并尝试了解更多信息。非常感谢所有的努力。
【解决方案2】:

如电子表格应用程序reference 中所述。

getActiveSheet()

获取电子表格中的活动工作表。电子表格中的活动工作表是电子表格 UI 中显示的工作表。

由于您没有使用任何 UI,因此您应该改用其他方法来访问您的表格和电子表格,例如:

获取您的电子表格

获取您的工作表

【讨论】:

  • 感谢您的回答和参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多