【问题标题】:How to increment simple formula by 1 in Google Apps Script?如何在 Google Apps 脚本中将简单公式加 1?
【发布时间】:2019-11-18 22:02:59
【问题描述】:

免责声明:我是 Google Apps 脚本新手。

我正在尝试在 Google 表格中创建一个时间表,让用户可以打卡和打卡以记录给定项目的小时数。我从YouTube video 借来了关于设置整个事情的一般结构的代码。

这是空白考勤表的样子。这是非常基本的:

我创建了一个用户按钮(在右侧),用户在其中按下“开始”,单元格 A2 将输入时间戳。然后用户可以按下“结束”按钮,将出现第二个时间戳,这次是在 B2 中,以及在 C2 中测量两个时间戳中的增量的简单计算,从而给出在给定时间上花费的持续时间任务或项目。这是它的样子:

当用户需要再次按“开始”时,单元格 A3 中会出现一个新的时间戳,依此类推,同时还会为每个新行计算一个新的增量。

问题:我无法在 C 列中获得简单的增量计算来递增每个新行,因此 setFormula 函数不包含对单元格 A2 和 B2 的硬编码引用。到目前为止,请参阅下面的代码:

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

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

function getNextRow() {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() + 1;
}


function addStartRecord (a) {
  var row = getNextRow();
  setValue('A' + row, a);
}

function addEndRecord (b, c) {
  var row = getNextRow()-1;
  setValue('B' + row, b);
  setValue('C' + row, c);
  }

function punchIn() {
 addSRecord(new Date()); 
}

function punchOut() {
  addERecord(new Date(), '=B2-A2');
}

问题在于底部的punchOut() 函数。关于在每个新行中递增此增量计算器的最佳方法的任何想法?

注意:我看到类似问题here 的一个很好的答案,但是代码在包含data[i] = ['=A' + i+1.toString() + ' + 1 ' ] 的行之后在脚本编辑器中抛出错误。另外,我不想为增量计算设置一个确定的最后一行(例如本例中的 20)。我希望用户能够根据需要为项目记录尽可能多的新开始/结束时间。

编辑:这是时间表的link,以便您可以测试代码。

【问题讨论】:

  • 您能否为您的工作表(或副本)提供编辑权限,以便能够测试代码?另外,一个用户是否可以在另一个用户按下他们的结束按钮之前按下他们的开始按钮?意思是,这是给每个人的单张纸吗?
  • 当然@AlbertoMolina - 我如何在这个论坛上提供一张表格?只发个链接?并且该工作表仅适用于单个用户。
  • 您可以更新您的问题(编辑)并在其中包含链接,您可以从电子表格本身获取共享链接,在右上角您会看到共享按钮,您可以在那里获得可分享的链接

标签: google-apps-script google-sheets


【解决方案1】:

尝试像这样修改您的 punchOut 方法:

function punchOut() {
  var ss = SpreadsheetApp.getActiveSheet();
  var row = ss.getLastRow();
  addEndRecord(new Date(), '=B' + row + '-A' + row);
}

我在工作表中对其进行了测试,效果很好。

【讨论】:

  • 美丽。非常感谢!
  • 没问题,乐于助人!
【解决方案2】:

setFormula() - 这使您能够描述要插入 C 列的公式。

以下是处理“Punch in”和“Punch Out”(及其计算)的两个简单函数。


function so5695101401in() {
  // punchin
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lR = sheet.getLastRow();
  // Logger.log("DEBUG: the last row is "+lR);
  var punchinRange = sheet.getRange(lR+1, 1);
  // Logger.log("DEBUG: the punchinRange = "+punchinRange.getA1Notation());
  punchinRange.setValue(new Date());
}
function so5695101401out() {
  // punchout
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var lR = sheet.getLastRow();
  //Logger.log("DEBUG: the last row is "+lR);
  var punchoutRange = sheet.getRange(lR, 2);
  // Logger.log("DEBUG: the punchoutRange = "+punchoutRange.getA1Notation());
  punchoutRange.setValue(new Date());
  var timeElapsed = sheet.getRange(lR, 3).setNumberFormat("hh:mm:ss");
  timeElapsed.setFormula("=B2-A2"); 
}

setFormula

【讨论】:

    【解决方案3】:

    我对这个问题使用了一种解决方法,通过应用脚本将带有公式的单元格复制到新的行或范围! 给你的问题:

    var formula1 = sheetDatos.getRange(lastRow, 3); //get the formula
    var copyRange = sheetDatos.getRange(lastRow+1, 3);
    formula1.copyTo(copyRange);
    

    对我来说,这种方式更容易,尝试在工作表中做以了解它是如何工作的。 你需要一个初始公式才能这样;)

    【讨论】:

      猜你喜欢
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多