首页 > 解决方案 > 如何使用 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');
  }
}

如果需要,我愿意制作另一个功能

谢谢你,保持安全

标签: google-apps-script

解决方案


我喜欢使用数据透视表的方法(因为它们非常适合处理此类数据)。您可以免费获得总计和其他功能。

但如果您只想将汇总数据写入电子表格,则可以使用以下方法:

我的出发点从您现有脚本中的这一行开始:

// 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

但是您可以改用所有现有代码,使用 mynameduration值将这些数据写入电子表格。

如果愿意,您可以应用其他逻辑按名称排序,并将数字数据四舍五入到首选的小数位数。


推荐阅读