繁体   English   中英

我想编写一个谷歌应用脚本来自动计算谷歌表格中的迟到天数

[英]I want to write a Google App Script to automate calculating late days in Google Sheet

在此处输入图像描述

我想编写一个自动化后期计算的代码。 这是它应该如何工作的

  • 如果之后日期的分数(例如:日期 10) - 前一天的分数(日期 9)> 0 => 之后日期的分数(120)将被分配“迟到 3 天”
  • 另一方面,该日期之后将继续查找并从下一个日期之前减去,直到它得到“> 0”结果。

该示例在附图中进行了说明。

这是我目前拥有的代码,但它不起作用:

function myFunction() {
  var app = SpreadsheetApp;
  var activeSheet = app.geActiveSpreadsheet().getActiveSheet();
  
  
  for (var i=2; i <= 8; i++){
  var scoreafterCell = activeSheet.getRange(i;2).getValue();
  var scorebeforeCell= activeSheet.getRange(i++;2).getValue();
    
  scoreDiff= scoreafterCell- scorebeforeCell;
    
    if(scoreDiff > 0) {
      activeSheet.getRange(i,3).setValue(3);
    } else for (var k=0; k++) {
      do {
      
      lateDays= k+=3;
      activeSheet.getRange(i,3).setValue(lateDays);
    }
      while (scoreDiff = 0);
            }
          }
      }

希望尽快有一些意见,因为这对我的工作非常重要。!! 谢谢你。

由于上面没有明确的模式,我做了一个黑客来实现你想要的。 这仅检查分数而不检查日期,因为lateDays不会依赖于此。

请看下面的代码。

function generateLateDays() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = activeSheet.getLastRow();
  var scores = activeSheet.getRange('B2:B' + lastRow).getValues().flat();
  var output = activeSheet.getRange('C2:C' + lastRow);
  
  var lateDays = [];
  while(scores.length > 0) {
    // get how many occurences does the first element have
    occurence = scores.filter(value => value === scores[0]).length;
    // remove current item in advance, we will only be checking number of occurences
    // exact value will not be checked, so scores should be in descending order
    scores = scores.filter(score => score !== scores[0]);
    
    // contains per score late days
    var temp = [];
    for(var j = 0; j < occurence; j++) {
      if(scores.length > 0) {
        // e.g. 3 duplicates will make temp 3, 4, 5 
        temp.push(j + 3);
      }
      else {
        // when last element is up, push 0
        temp.push(0);
      }
    }
    // e.g. temp reverse will be 5, 4, 3
    temp.reverse();
    // add to final output
    lateDays.push(temp);
  }
  // convert 2d array to 1d array
  lateDays = lateDays.flat();
  for(var i = 0; i < lateDays.length; i++) {
    // convert all elements into an array for setValues
    lateDays[i] = [].concat(lateDays[i]);
  }
  output.setValues(lateDays);
}

请注意,这仅适用于您的样品表的工作顺序。 我没试过做上升。 由于您的工作表分数下降,我就这样工作了。

如果您有任何疑问,请随时在下面提问。

以下是我建议的答案。 一探究竟:

function getLateDates() {
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var scores = activeSheet.getRange('B2:B10').getValues().flat();
  var output = activeSheet.getRange('D2:D10');

  /**
   * Set LateDates[_] as array of 3,
   * except the last value = 0 ( at t = 0 )
   *
   */
  let LateDates = [
    ...Array.from({ length: scores.length - 1 }).map((x) => 3),
    0,
  ];

  /** Check the diff of current score with each of the next score,
   * if diff > 0 --> break --> LateDates[current] = 3
   * if diff = 0 --> +1 to LateDates[current], and continue w the next score
   *
   */
  for (var current = 0; current < scores.length; current++) {
    for (var next = current + 1; next < scores.length; next++) {
      let d = scores[current] - scores[next];
      if (d > 0) {
        break;
      } else {
        LateDates[current]++;
      }
    }
  }

  /**
   * Reduce the LateDates to fit setValues format
   */
  let result = LateDates.reduce((a,c)=> ([...a,[c]]),[])
  output.setValues(result)
  //console.log('result', result);
}

请注意,我正在使用您的日期顺序(降序)。 如果它是升序的,请将 0 切换到LateDates[]的顶部:

let LateDates = [
    0,
    ...Array.from({ length: scores.length - 1 }).map((x) => 3),
  ];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM