google-apps-script - 如何使用 Google App Script 定位唯一名称并将其值加起来
问题描述
因此,我使用 importGoogleCalendar 代码将我的员工姓名和工作时间从 Google 日历中提取到 Google 表格中。然而,我拉了一切。这些名称在每天的多行中重复多次,并附有相应的时间。我怎样才能为每个工人获得一个唯一的名字以及每次他们的名字出现在另一张工作表上的加起来的小时数,这样它看起来更干净、更容易查看?
例:我想要
姓名 | 小时 |
---|---|
山姆 | 5 |
山姆 | 7 |
鲍勃 | 3 |
山姆 | 5 |
山姆 | 7 |
鲍勃 | 6 |
乔 | 4 |
看起来像
姓名 | 小时 |
---|---|
山姆 | 24 |
鲍勃 | 9 |
乔 | 4 |
这是代码:
function importGoogleCalendar() {
var sheet = SpreadsheetApp.getActiveSheet();
var calendarId = sheet.getRange('B1').getValue().toString();
var calendar = CalendarApp.getCalendarById(calendarId);
// Set filters
var startDate = sheet.getRange('B2').getValue();
var endDate = sheet.getRange('B3').getValue();
var searchText = '';
// Print header
var header = [["Title", "Description", "Start", "End", "Duration"]];
var range = sheet.getRange("A6:E6");
range.setValues(header);
range.setFontWeight("bold")
// Get events based on filters
var events = (searchText == '') ? calendar.getEvents(startDate, endDate) : calendar.getEvents(startDate, endDate, {search: searchText});
// Display events
for (var i=0; i<events.length; i++) {
var row = i+7;
var details = [[events[i].getTitle(), events[i].getDescription(), events[i].getStartTime(), events[i].getEndTime(), '']];
range = sheet.getRange(row,1,1,5);
range.setValues(details);
// Format the Start and End columns
var cell = sheet.getRange(row, 3);
cell.setNumberFormat('mm/dd/yyyy hh:mm');
cell = sheet.getRange(row, 4);
cell.setNumberFormat('mm/dd/yyyy hh:mm');
// Fill the Duration column
cell = sheet.getRange(row, 5);
cell.setFormula('=(HOUR(D' + row + ')+(MINUTE(D' +row+ ')/60))-(HOUR(C' +row+ ')+(MINUTE(C' +row+ ')/60))');
cell.setNumberFormat('0.00');
}
}
如果需要,我愿意制作另一个功能
谢谢你,保持安全
解决方案
我喜欢使用数据透视表的方法(因为它们非常适合处理此类数据)。您可以免费获得总计和其他功能。
但如果您只想将汇总数据写入电子表格,则可以使用以下方法:
我的出发点从您现有脚本中的这一行开始:
// Get events based on filters
var events = (searchText == '') ? calendar.getEvents(startDate, endDate) : calendar.getEvents(startDate, endDate, {search: searchText});
从那里我将您的events
数组传递给一个新函数:
function summarize(events) {
var totalsByName = new Map();
events.forEach((event) => {
let name = event.getTitle();
// duration in seconds (from milliseconds / 1000):
let duration = Math.abs(event.getEndTime() - event.getStartTime()) / 1000.0;
if (totalsByName.has(name)) {
// increment the existing duration for this person:
totalsByName.set(name, totalsByName.get(name) + duration);
} else {
// add the first entry for this person:
totalsByName.set(name, duration);
}
} );
// iterate over each entry in the map:
for (let [name, duration] of totalsByName) {
console.log(name + ' = ' + (duration / 3600.0));
}
}
该函数填充一个map
结果 - 每个人的姓名一个条目。
在我的示例中,我所做的只是将数据打印到控制台。
console.log(name + ' = ' + (duration / 3600.0)); // convert seconds to hours
但是您可以改用所有现有代码,使用 myname
和duration
值将这些数据写入电子表格。
如果愿意,您可以应用其他逻辑按名称排序,并将数字数据四舍五入到首选的小数位数。
推荐阅读
- javascript - 如果底层数据发生变化,如何防止 const 中的数据发生变化
- python - 如何在 tensorflow Lite 中使用 EfficientNet-Lite4
- r - gganimate 并行 - 提供的文件不存在错误
- android - Android Studio 虚假“无法解析相应的 JNI 函数”
- database-design - 是什么让数据管道具有可扩展性?
- reactjs - 使用 typescript 和 webpack 在 CRA 上启用源映射
- azure-functions - Azure Functions Blob 输入绑定,没有错误,没有创建文件
- python - ImportError:在 vscode 中使用导入 syft 导入 lib 时 DLL 加载失败
- c++ - C ++中的堆栈或堆内存中的数据成员
- spring-boot - 覆盖在 spring 云配置服务器中检索到的属性值