A列的时间戳按升序排列。 G栏有员工姓名。列L中的每个单元格具有1,0或空白。我试图计算每个员工在L栏中1的最新情况。我目前的尝试涉及一个员工姓名列表,其中包含以下过滤器,"过滤器L:L其中G:G =员工姓名,L:L不为空白"。我的想法是将此过滤器嵌套在自定义公式中,该公式迭代过滤结果,计算1的条纹并在第0个停止,返回1的计数。由于时间戳是按升序排列的,我需要它从最后一行向上迭代(或弄清楚如何更改我的数据导入以附加到工作表的顶部而不是底部)。我的编程经验很少,但这是我失败的尝试。我多么令人难以置信? (顺便说一句,我只是意识到我需要它从下往上迭代):
function streak() {
var sheet = SpreadsheetApp.getActiveSheet()
var range = sheet.getActiveRange();
var cell = sheet.getActiveCell();
var value = cell.getValue();
for (i in range) {
var count = 0
if (value = 1) {
count += 1;
} <br>
return count;
} <br>
} <br>
答案 0 :(得分:0)
你有点接近,但取决于你想做什么,这可能会变得非常复杂。然而,你走在正确的轨道上。
首先要做的是获取电子表格中有效范围的值。
var myDataVals = SpreadsheetApp.getActiveSheet().getActiveRange().getValues();
这会将一个二维数组分配给myDataVals
。
从这里你可以循环遍历外部数组(逐行),然后遍历每个内部数组(逐列)。有很多方法可以解决这个问题,这实际上取决于你正在尝试做什么。您可以在此处了解有关基本JavaScript编程的更多信息:https://www.javascript.com/resources
我写了一个你可以玩的样本函数。我的解决方案是遍历行(外部数组),然后将它们分配给一个对象,其中键是员工姓名;这有效地按名称排序行。然后我按时间戳值按降序对每个名称中的行进行排序。然后,从第一个(最近的)时间戳开始,我检查列L是否有1或0.如果我找到1,我将位于键的streaks对象中的数字增加1,名称为1。如果我找到0,则条纹被破坏,我通过将streakEnded布尔值更改为true来退出while循环。如果单元格为空或者值不是1或0,则不执行任何操作,循环继续进行,直到停止或没有剩余行为止。
最后,返回条纹对象。从那里你可以在工作表中创建一个新页面,或者通过电子邮件或其他任何你想做的事情发送结果。现在,我只是将对象记录到脚本记录器中。您可以通过在脚本编辑器中选择(查看&gt;日志)来查看结果。确保您已突出显示细胞范围!
function streak() {
var activeRangeVals, allStreaks, columns;
// Get the active range as a 2-dimensional array of values
activeRangeVals = SpreadsheetApp.getActiveSheet().getActiveRange().getValues();
// Define which columns contain what data in the active Range
// There are better ways to do this (named ranges)
// but this was quickest for me.
columns = {
'name': 6, // G
'streak': 11, // L
'time': 0 // A
};
allStreaks = getStreaks(getEmployeeRowsObject(activeRangeVals));
Logger.log(allStreaks);
return allStreaks;
function getEmployeeRowsObject(data) {
// Create an empty object to hold employee data
var activeName, activeRow, employees = {}, i = 0;
// Iterate through the data by row and assign rows to employee object
// using employee names as the key
for(i = 0; i < data.length; i+= 1) {
// Assign the active row by copying from the array
activeRow = data[i].slice();
// Assign the active name based on info provided in the columns object
activeName = activeRow[columns['name']];
// If the employee is already defined on the object
if(employees[activeName] !== undefined) {
// Add the row to the stack
employees[activeName].push(activeRow);
// If not:
} else {
// Define a new array with the first row being the active row
employees[activeName] = [activeRow];
}
}
return employees;
}
function getStreaks(employees) {
var activeRow, activeStreak, i = 0, streaks = {}, streakEnded;
for(employee in employees) {
activeRow = employees[employee];
// Sort by timestamp in descending order (most recent first)
activeRow = activeRow.sort(function(a, b) {
return b[columns['time']].getTime() - a[columns['time']].getTime();
});
i = 0, streaks[employee] = 0, streakEnded = false;
while(i < activeRow.length && streakEnded === false) {
activeStreak = parseInt(activeRow[i][columns['streak']]);
if(activeStreak === 1) {
streaks[employee] += 1;
} else if(activeStreak === 0) {
streakEnded = true;
}
i += 1;
}
}
return streaks;
}
}