使用Apps脚本网络应用访问Google表格

时间:2017-11-19 11:24:51

标签: google-apps-script

我有一个日常工作日志,供我修理其设备的各个客户使用。此工作日志采用具有多个工作表的Google电子表格的形式,其中每个工作表都分配给特定的常规客户。我通过基于Google Apps脚本的手机,通过基本网络应用程序记录当前日期,工作设备和工作完成情况。

在我的开发环境中,我使用模态对话框“测试”弹出框,它完美无缺。我从下拉列表中选择客户,在文本字段中输入信息并单击“保存”,相关客户的工作表将填充数据。但是,当我发布或部署应用程序时,尽管从列表中选择了任何客户,但只会填充最左侧的工作表(sheet1)。不知何故,通过URL访问“服务器”电子表格会使“google.script.run”调用失效。有没有人有任何想法如何解决这个问题。在此提前感谢您提供任何帮助。

**Index.html**

<!DOCTYPE html>
<html lang='en'>
<head>

<base target="_top">
  <meta charset="utf-8">
  <title></title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, 
   maximum-scale=1.0">    
</head> 
<body>
<form>  
<h1>Daily Work Record</h1>    

<p><label class="question" for="customer">Customer: </label>
            <select name="customer" id="customer" onchange    
="customerSelect(this)"/>

                <option></option>
                <option value="1">Customer A</option>
                <option value="2">Customer B</option>
                <option value="3">Customer C</option>
            </select></p>                   


<p><label class="question" for="equipment">Equipment: </label>       
             <select name="equipment" id="equipment"> 
                <option>Toaster</option>
                <option>Mixer</option>
                <option>Blender</option>
                <option>Slicer</option>                                             
                <option>Other</option>                              
              </select></p>                               

<p><label class="question" for="work">Work Done: </label>
<input type="text" name="work" id="work" placeholder="enter work carried 
 out" size="25" /></p>


 <input type="button" id="button" value="Save"
    onclick="google.script.run
       .withSuccessHandler(DataSaved)
        .itemAdd(this.parentNode)"/>             

</form> 
<script>    

    function customerSelect(menu){      
          if(menu.value=='1'){  
           google.script.run.sheetOne();   

        } else if(menu.value=='2'){
           google.script.run.sheetTwo();

        } else if(menu.value=='3'){
           google.script.run.sheetThree();             

        } else return false; 

        }   

</script>    

<div id="Message"></div>

<script>
       function DataSaved(){
       document.getElementById('Message').innerHTML="<span class='save'>Data 
       Saved</span>";
       return;
       }

</script>      
</body>    

**Code.gs**

function onOpen() {
   var ui = SpreadsheetApp.getUi();
   ui.createMenu('Test').addItem('PopUp', 'show').addToUi();
}

function show() {
   var html = HtmlService.createHtmlOutputFromFile('Index')
             .setSandboxMode(HtmlService.SandboxMode.IFRAME)  
             .setHeight(800)
             .setWidth(800)
   SpreadsheetApp.getUi().showModalDialog(html, 'Enter Job Details');  
}  

function doGet() {
    var html = HtmlService.createHtmlOutputFromFile('Index')
              .setSandboxMode(HtmlService.SandboxMode.IFRAME);
              return html;  
}

function sheetOne() {    
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName("Customer A");
    sheet.getRange("A1").activate();//used instead of setActiveSheet
    return true;
}

function sheetTwo() {    
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheetByName("Customer B");
   sheet.getRange("A1").activate(); 
   return true;
}

function sheetThree() {    
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheetByName("Customer C");
   sheet.getRange("A1").activate(); 
   return true;
}

function itemAdd(form) {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = SpreadsheetApp.getActiveSheet();
   sheet.appendRow([Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd"), 
    form.equipment, form.work]);
return true;
}

1 个答案:

答案 0 :(得分:0)

我会使用不同的策略。我不会尝试预先设置活动表。因此,您不需要SELECT标记中的function itemAdd(form) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetToValue = {//Object literal mapping user answer to sheet tab name "Customer A":"Customer A", "Customer B":"Customer B", "Customer C":"Customer C" } var whichSheetToGet = sheetToValue[form.customer]; var sheet = ss.getSheetByName(whichSheetToGet);//Get sheet tab sheet.appendRow([Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd"), form.equipment, form.work]); return true; } 函数。

{{1}}

您也不需要任何功能:

  • sheetOne
  • sheetTwo
  • sheetThree

更改{{1}}功能以按名称获取工作表标签

{{1}}