使用整数复制公式并引用当前行上方的单元格

时间:2013-12-02 20:09:14

标签: google-apps-script google-sheets

我正在尝试在Google电子表格的google apps脚本中的if函数中复制以下公式。

=IF(AND((G2/(1/96)/(INT(G2/(1/96))))=1,B2<>B1),F2, "")

在D列中填充单元格。我试图让它工作,以便它遍历每一行,并且工作应用这个公式。

我认为我在努力复制公式的方法是如何使它成为一个整数以及如何让脚本读取上面一行中的单元格。

任何帮助将不胜感激!请参阅下文,了解我对此的初步尝试。

function releaseTimes() {
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; 
var numRows = 249;  
var dataRange = sheet.getRange(startRow, 1, numRows, 16)
var data = dataRange.getValues();

for (var i = 0; i < data.length; ++i) {
var row = data[i];
var startTime = row[1];

var quarterHour = (1/96);
var committedSeats = (startTime-halfHour);
var startTime1 = sheet.getRange(startRow + i, 2);
var startTime2 = sheet.getRange(startRow + i-1, 2);
var G2 = (startTime2-quarterHour);
var G2divided = (G2/quarterHour);
var int = parseInt(G2divided);
var firstCondition = G2divided/int;

    if ( firstCondition = 1 && startTime2 != startTime1) {
    sheet.getRange(startRow + i, 4).setValue(committedSeats);
    } else { 
      sheet.getRange(startRow + i, 4).setValue(blank); 
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您提供的电子表格功能:

=IF(AND((G2/(1/96)/(INT(G2/(1/96))))=1,B2<>B1),F2, "")

可以这样表达:

IF (G2 is a time ending on the quarter hour) AND (B2 is not equal to B1)
THEN
  DISPLAY F2
ELSE
  DISPLAY nothing
ENDIF

出现神奇数字96,因为24小时内有96个小时。如果只是处理时间,代码会更加清晰,如下:

var firstCondition = (startTime.getMinutes() % 15 == 0);  /// BOOLEAN!
但是,你的问题中存在一些混乱。电子表格公式引用了列&#34; G&#34;,释放所有保留,进行15分钟的检查。但是,您的脚本会使用列&#34; B&#34;,开始时间。查看示例数据,有&#34;显示9和#34;等行。开始时间是&#34; 15&#34;虽然发布 - 所有不是,所以你会得到不同的结果,这取决于这两个计算中的哪一个&#34;正确&#34;。 我假设您的脚本是正确的,并且所有时间都相对于开始时间。

最后一点......在您的脚本中,您混合了两种操作范围数据的方法。您可以使用var data = dataRange.getValues();开始(更高效)javascript方法,但随后返回到使用sheet.getRange()等语句触摸单个单元格。这令人困惑,因为第一个使用基于0的索引,而电子表格使用基于1的索引。如果可能的话,选择一种方式,坚持下去。

脚本

这是您脚本的更新版本。电子表格数据只需访问两次 - 它可以批量读取和写入,从而节省了时间与逐个单元格的更新。所有时间都相对于startTime计算,如果您愿意,可以更改。最后,javascript Date对象方法用于所有时间计算,避免使用幻数。

function releaseTimes() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headRows = 1;  // # header rows to skip
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();

  // Handy time definitions
  var minute = 60 * 1000; // 60 * 1000 ms
  var quarterHour = 15 * minute;
  var halfHour = 30 * minute;
  var hour = 60 * minute;

  // Process data, skipping headRows
  for (var i = headRows; i < data.length; ++i) {
    var row = data[i];
    var startTime = row[1];  // Assume all times are relative to startTime    
    var prevStartTime = data[i-1][1];

    // Test whether startTime is on a quarter-hour
    var firstCondition = (startTime.getMinutes() % 15 == 0);

    // Committed blank unless unique quarter hour start time
    // NOTE: You can't compare javascript time objects using ==
    // See: http://stackoverflow.com/a/7961381
    if ( firstCondition && (prevStartTime - startTime) != 0) {
      row[3] = new Date(startTime.getTime() - halfHour);  // Monitor Committed Seats. Return to sale orders that
    } else {                                              //have been in the basket for over 1 hour.
      row[3] = ''; 
    }
    row[4] = new Date(startTime.getTime() - hour);        // Release Press Holds bar 2
    row[5] = new Date(startTime.getTime() - halfHour);    // Release all Company Holds. Release Venue Holds bar 2
    row[6] = new Date(startTime.getTime() - quarterHour); // Release all remaining holds
  }
  // Write out updated information
  dataRange.setValues(data);
}

结果

正如您所看到的,结果与您的初始示例略有不同,因为决定基于startTime作出决定。

Screenshot