TypeError:无法读取未定义的属性“ shet”

时间:2020-09-13 21:56:38

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

有一个错误,我不知道哪里出了问题。我最近开始从YouTube编写代码。因此,我想对应该在哪里进行修复并使代码正常工作提出一些建议。

    **code**

    function doGet() {
      

  return HtmlService.createHtmlOutputFromFile("inded");
    }
function userClicked(data){
var url ="myurl";
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName([data.shet]);
ws.appendRow([data.nb,data.kun,data.bath,data.tod,data.bon,data.lan,data.sam,data.ha]); 
}

我将输入的唯一信息(nb,kun,浴,tod,bon,lan,sam,ha)是数字。 “ shet”是工作表的编号。

**html**
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <h1>กรอกเลข</h1>
   <div>
   <label>ใบที่</label><input type="text" id="shet">
   </div>
   <div>
   <label>ตัวเลข</label><input type="text" id="nb">
   </div>
   <div>
   <label>คูณ กลับ</label><input type="text" id="kun">
   </div>
   <div>
   <label>เต็ง บาท </label><input type="text" id="bath">
   </div>
   <div>
   <label>โต๊ด</label><input type="text" id="tod">
   </div>
   <div>
   <label>วิ่งบน</label><input type="text" id="bon">
   </div>
   <div>
   <label>วิ่งล่าง</label><input type="text" id="lan">
   </div>
   <div>
   <label>2ใน3</label><input type="text" id="sam">
   </div>
   <div>
   <label>2ใน5</label><input type="text" id="ha">
   </div>
   <div>
   <button id="btn"> บันทึกข้อมูล </button>
   </div>
   <script>
     document.getElementById("btn").addEventListener("click", saveData);
     
     function saveData() {
     var data = {}
         data.shet = document.getElementById("shet").value;
         data.nb = document.getElementById("nb").value;
         data.kun = document.getElementById("kun").value;
         data.bath = document.getElementById("bath").value;
         data.tod = document.getElementById("tod").value;
         data.bon = document.getElementById("bon").value;
         data.lan = document.getElementById("lan").value;
         data.sam = document.getElementById("sam").value;
         data.ha = document.getElementById("ha").value;
     google.script.run.userClicked(data);
     document.getElementById("shet").value="";
     document.getElementById("nb").value="";
     document.getElementById("kun").value="";
     document.getElementById("bath").value="";
     document.getElementById("tod").value="";
     document.getElementById("bon").value="";
     document.getElementById("lan").value="";
     document.getElementById("sam").value="";
     document.getElementById("ha").value="";
     
     }
    </script>
  </body>
</html>

2 个答案:

答案 0 :(得分:1)

问题:

userClicked应该在单击HTML中的“提交”按钮时运行。在这种情况下,您在HTML data元素中输入的<input>将作为参数传递。相反,您尝试直接从脚本编辑器执行userClicked,因此不会将data作为参数传递:dataundefined,因此错误是重新获得。

解决方案:

如果要从脚本编辑器进行测试,请添加一些默认数据,以防没有传递data作为参数。像这样:

function userClicked(data) {
  if (!data) {
    var data = {};
    data.shet = 1;
    data.nb = "Whatever";
    // Rest of `data` properties
  }
  // Rest of your function
}

但是请记住,应该从您的HTML中调用它。

其他问题:

  • 如果提交的shet值是您要获取的工作表的名称,则应从[]中删除var ws = ss.getSheetByName([data.shet]);getSheetByName(name)应该会收到String),即使您不进行任何更改也可能会将数据附加到工作表中。

  • 如果提交的shet值是与所需工作表的index相对应的数字,则应将其更改为var ws = ss.getSheets()[data.shet];(请参见getSheets()),但请考虑到index是基于0的。

相关:

答案 1 :(得分:0)

修改点:

  • 您当前的解决方案不在寻找工作表编号。

  • 正如您在 .gs 文件中看到的那样,您要输入的名称 工作表:

    var ws = ss.getSheetByName([data.shet]);
    
  • 指定,请使用getSheets()代替工作表编号:

    var ws = ss.getSheets()[data.shet];
    

重要的是要提到ss.getSheets()是所有数组 电子表格文件中的图纸对象。指定第一张纸 (从左到右)编号从0开始,因此ss.getSheets()[0]。因此,在 您的网络应用程序,如果要与第一工作表进行交互, 需要在第一个字段中通过 0 。如果您想要第二表 然后 1 等。


解决方案:

仅修改 .gs 代码,如下所示:

function doGet() {
   return HtmlService.createHtmlOutputFromFile("inded");
}
function userClicked(data){
   var url ="myurl";
   var ss = SpreadsheetApp.openByUrl(url);
   var ws = ss.getSheets()[data.shet];
 ws.appendRow([data.nb,data.kun,data.bath,data.tod,data.bon,data.lan,data.sam,data.ha]); 
}

保持 inded.html 文件不变。


说明(如果适用):

如果尚未完成此操作,则需要作为网络应用程序部署

请按照以下步骤操作:

  1. 点击 Publish => 部署为网络应用

deploy

  1. 在弹出窗口中单击部署,然后打开新创建的Web应用程序URL。

注意,如果您已经部署了Web应用程序,则在进行更改后,您需要执行步骤1,然后更新当前项目。