Google表格时间跟踪器:更新#1

时间:2018-04-11 13:10:57

标签: google-apps-script google-sheets

我正在尝试根据视频here制作时间表。但是,在视频中,他设置它以便为两个用户构建,而我的仅用于一个用户。

当用户按下按钮(实际上是图纸)时,我希望将时间记录在单元格B2中,并将状态(中)记录在E2中。同样,当用户按下按钮(另一个图纸)以进行退出时,我希望将时间记录在C2中,并且状态(Out)仍然记录在E2中。 D栏将告知经过的时间,这将用于确定每周工资。

这里是" Clock In"按钮被分配了" In"功能和"时钟输出"按钮被分配了" Out"功能:

function setValue(cellName, Value) {
  SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(Value);
}

function getValue(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValue();
}

function getNextRowIn() {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() - 6;
}

function getNextRowOut() {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() - 6;
}

function addRecordIn(b) {
  var row = getNextRowIn ();
   setValue('B' + row, b);
}

function addRecordOut(c) {
  var row = getNextRowOut ();
   setValue('C' + row, c);
}

function In() {
  setValue('E2', 'In');
  addRecordIn(new Date());
}

function Out() {
  setValue('E2', 'Out');
  addRecordOut(new Date());
}

我需要做些什么才能使这个代码工作,以便每次用户按下" Clock In"它从B列顺序记录,从B2开始。 C列中的时钟输出相同,从C2开始?

以下是我正在使用的工作表的图片: View it on Imgur

1 个答案:

答案 0 :(得分:1)

这就是我的方式。

<强> timerecord.html:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
    $(function() {

      });
      function punchIn(){
        google.script.run.punchIn();
      }
      function punchOut(){
        google.script.run.punchOut();
      }

    console.log('My Code');
    </script>
  </head>
  <body>
   <input type="button" value="Punch In" onClick="punchIn()" />
   <input type="button" value="Punch Out" onClick="punchOut()" />
  </body>
</html>

<强> code.gs:

function onOpen(){
  SpreadsheetApp.getUi().createMenu('My Tools')
     .addItem('Time Clock', 'showTimeTrackerSidebar')
     .addToUi();
}

function punchIn() {
  SpreadsheetApp.getActive().getSheetByName('Time Record').appendRow([Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MMM dd yyyy HH:mm:ss")])
}

function punchOut(){
  var ss=SpreadsheetApp.getActive()
  var sh=ss.getSheetByName('Time Record');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var lr=vA[vA.length-1];
  var outdt=Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MMM dd yyyy HH:mm:ss");
  vA[vA.length-1][1]=outdt;
  vA[vA.length-1][2]=calcTimeDifference(vA[vA.length-1][0],outdt);
  rg.setValues(vA);
}

function showTimeTrackerSidebar(){
  var ui=HtmlService.createHtmlOutputFromFile('timerecord');
  SpreadsheetApp.getUi().showSidebar(ui);
}

function calcTimeDifference(Start,End)
{
  if(Start && End)
  {
    var hour=1000*60*60;
    var t1=new Date(Start).valueOf();
    var t2=new Date(End).valueOf();
    var d=t2-t1;
    var hours=d/hour;
    return hours
  }
  else
  {
    return 'Invalid Inputs';
  }
}

这就是屏幕的样子:

enter image description here

此视图显示菜单

enter image description here

  
    

我没有用图像构建伪相按钮,而是使用了侧边栏并使用了标准<input type="button" value="Punch Out" onClick="punchOut();" />这样可以更容易地扩展到其他功能。您需要查看google.script.run功能here。您还需要运行onOpen一次以使用siderbar功能更新菜单。

         

这将使用punchIn和punchOut追加新的日期时间,并添加日期时间并计算最后一行的差异。