[英]I want to write a Google App Script to automate calculating late days in Google Sheet
我想编写一个自动化后期计算的代码。 这是它应该如何工作的
该示例在附图中进行了说明。
这是我目前拥有的代码,但它不起作用:
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.