【问题标题】:Need to Query Google Sheet for specific data from Google Apps Script需要从 Google Apps 脚本查询 Google Sheet 以获取特定数据
【发布时间】:2021-01-15 09:52:33
【问题描述】:

我创建了一个网络应用程序来跟踪我公司员工的工作时间,该网络应用程序很简单,它首先要求他们提供用户名和密码,然后允许他们注册他们的进入时间退出时间。我的老板还问我是否有一种方法可以让员工查看他们最近 3 次注册是什么,以防他们可能忘记记录进入或退出时间。所以我需要做的是在接收数据的工作表中查找每个员工的特定姓名/ID,然后在 Web 应用程序的“最后注册”部分下打印该数据。

这是一个最小的可重现示例,它只询问一个名称,在数据库中查找该名称,然后允许您发送您的提交,同时带上提交的时间戳。我需要看到的是如何在“ReceivedData”的数据库中查找该人的姓名(来自网络应用程序上的早期注册)以及如何将该提交的时间戳带到“最后注册部分”。这也是一个包含一些数据的电子表格,您可以在其中工作。 (https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0)

抱歉,描述太长了,谢谢。

var name="";

function doGet(e) {
  return HtmlService.createHtmlOutputFromFile('Form');
}
function AddRecord(Name) {
  
  // get spreadsheet details
  var url = 'https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0';
  //Paste URL of GOOGLE SHEET
  var ss1= SpreadsheetApp.openByUrl(url);
  var webAppSheet1 = ss1.getActiveSheet();
  const Lrow = webAppSheet1.getLastRow();
  const data = [Name, new Date ()];

  webAppSheet1.getRange(Lrow+1,1, 1, data.length).setValues([data])       
}

function checkLogin(Name) {
  var url = 'https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0';
  //Paste URL of GOOGLE SHEET
  var ss2= SpreadsheetApp.openByUrl(url);
  var webAppSheet2 = ss2.getSheetByName("DataBase");
  var getLastRow =  webAppSheet2.getLastRow();
  var found_record = '';
  for(var i = 1; i <= getLastRow; i++)
  {
   if(webAppSheet2.getRange(i, 1).getValue() == Name)
   {
     found_record = 'TRUE';
   }    
  }
  if(found_record == '')
  {
    found_record = 'FALSE'; 
  }
  
  return found_record;
  
}
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
    function AddRow()
    {
      var Name = document.getElementById("Name").value;  
      google.script.run.AddRecord(Name);
      document.getElementById("Name").value = '';
      }    
          function LoginUser()
    {
    var Name = document.getElementById("Name").value;
    
    google.script.run.withSuccessHandler(function(output) 
    {
      if(output == 'TRUE')
      {
        document.getElementById("loginDisplay").style.display = "none";
        document.getElementById("dataDisplay").style.display = "block";     
      }
      else if(output == 'FALSE')
      {
        document.getElementById("errorMessage").innerHTML = "Name not found";     
      }    
    }).checkLogin(Name);
    }
    </script>
</head>
<body>
<div id="loginDisplay">
    <div> 
    <label>Name</label><br>
    <input type="text" id="Name" />
    </div>
    
    <div class="btn">
<input value="Login" onclick="LoginUser()"
 type="button">
 <span id="errorMessage"></span>
</div> 

    </div>
    <div style="display:none"  id="dataDisplay">
    <div>
    <label>Last Registrations</label>
    <br><br>
    <button type="button" value="Add" onclick="AddRow()">Send</button>
</div>
</div>
  </body>
</html>

【问题讨论】:

  • 您需要在您的链接上提供公共访问权限
  • 对不起,我忘了。

标签: javascript html google-apps-script google-sheets


【解决方案1】:

我相信你的目标如下。

  • 来自So what I need to do is look for each employee's specific name/id in the sheet where the data is being received, and print that data on the web app under a "Last Registrations" section.All i would need to see is how to look for the person's name in the data base of "ReceivedData" (which comes from earlier registrations on the the web app) and how to bring the timestamp from that submission to the web app under the "Last Registrations section".,我理解你的问题如下。

    1. 您想从电子表格的ReceivedData 工作表中搜索输入的值。
    2. 您希望将通过从工作表中搜索输入值检索到的最后一个时间戳放在“最后注册部分”的下方。

修改点:

  • 从你的脚本来看,我认为当搜索输入值的脚本包含在 GAS 端的函数checkLogin 中时,它可能是合适的。
  • 并且,为了显示最后一个时间戳,&lt;div id="lastTimestamp"&gt;&lt;/div&gt; 被添加到 HTML 中,LoginUser 在 Javascript 中被修改。

当以上几点反映到你的脚本中时,它变成如下。

修改后的脚本:

Google Apps 脚本方面:

请修改checkLogin如下。

function checkLogin(Name) {
  var url = 'https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0'; //Paste URL of GOOGLE SHEET
  var ss2= SpreadsheetApp.openByUrl(url);
  var webAppSheet2 = ss2.getSheetByName("DataBase");
  var check = webAppSheet2.getRange(2, 1, webAppSheet2.getLastRow(), 1).createTextFinder(Name).matchEntireCell(true).findNext();
  var obj = {check: check ? 'TRUE' : 'FALSE'};
  var sheet = ss2.getSheetByName("ReceivedData");
  var ranges = sheet.getRange(2, 1, sheet.getLastRow(), 1).createTextFinder(Name).matchEntireCell(true).findAll();
  if (ranges.length > 0) {
    obj.lastTimestamp = ranges.pop().offset(0, 1, 1, 1).getDisplayValue();
    return obj;
  }
  return obj;
}

HTML & Javascript 方面:

请修改LoginUser如下。

function LoginUser() {
  var Name = document.getElementById("Name").value;
  google.script.run.withSuccessHandler(function({check, lastTimestamp}) {
    if(check == 'TRUE') {
      document.getElementById("loginDisplay").style.display = "none";
      document.getElementById("dataDisplay").style.display = "block";
      document.getElementById("lastTimestamp").innerHTML = lastTimestamp;
    } else if(check == 'FALSE') {
      document.getElementById("errorMessage").innerHTML = "Name not found";
    }
  }).checkLogin(Name);
}

并且,请按如下方式添加 HTML。

从:
<label>Last Registrations</label>
<br><br>
<button type="button" value="Add" onclick="AddRow()">Send</button>
至:
<label>Last Registrations</label>
<br><br>
<div id="lastTimestamp"></div>
<button type="button" value="Add" onclick="AddRow()">Send</button>

注意:

  • 在此修改后的脚本中,使用了您共享的电子表格和脚本。因此,当电子表格的结构发生变化时,脚本可能无法使用。请注意这一点。

参考:

【讨论】:

  • 谢谢,它似乎工作得很好!但是你知道我如何调整它来检查用户名和密码(并确保这一致),而不仅仅是一个名字?
  • @Sebastian Carrasco 感谢您的回复。我很高兴你的问题得到了解决。我愿意支持你。不幸的是,我无法对您的新问题有清晰的认识,这与您的问题不同。我为此道歉。那么您可以通过包含详细信息将其作为新问题发布吗?因为当您的初始问题被评论更改时,看到您的问题的其他用户会感到困惑。通过将其发布为新问题,包括我在内的用户都可以想到它。如果你能合作解决你的新问题,我很高兴。你能合作解决你的新问题吗?
  • 这是我添加的新问题的链接。 stackoverflow.com/questions/65773045/…
  • 我认为解决方案类似于这个问题,但唯一的区别是,不仅仅是在“数据库”表中查找员工的姓名,“CheckLogin”功能还必须搜索密码并确保它与员工的姓名匹配。
  • @Sebastian Carrasco 感谢您的回复。我看到了你的新问题并发布了答案。你能确认一下吗?如果这不是您期望的结果,我深表歉意。
猜你喜欢
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多