【问题标题】:Sheet showing available hours between everyone显示每个人之间的可用时间的工作表
【发布时间】:2019-10-28 04:24:24
【问题描述】:

我想创建一个电子表格,我可以在其中添加人员,并查看每个人都有哪些时间可以参加在线会议。必须考虑时区,但我不知道该怎么做。

Person1 工作表示例:

比赛时间:

我认为我的想法显示“5 匹配 4”很好,因为剩下的可以努力显示和编辑它,这样它就可以像“5 匹配 5”。但欢迎提出任何其他建议。

实际电子表格的链接(复制到您自己的驱动器以便您可以编辑):https://docs.google.com/spreadsheets/d/1yun8uMW2LZUumlm6cy3hqPT-FLQipADSIjLQPNiwXl4/edit?usp=sharing

PS:支持 DST(夏令时)会很好,但这不是强制性的。在夏令时的人会调整它。

【问题讨论】:

  • 您能否编辑您的问题以解释/演示两件事:1)对于“比赛”表,请解释您建议如何按时区调整比赛; 2) 每个人要么全天可用,要么全天不可用。请举例说明某些员工在一天中的特定时间不可用。
  • 对电子表格进行了一些更改以更好地说明它。 1) 在单元格 D1 中,当前工作表的每个所有者都将使用基于 GMT 的对应时区进行编辑。 2) 不,只是一个例子。我试着混合了一点,所以 can 似乎更“真实”。

标签: google-sheets spreadsheet google-sheets-api


【解决方案1】:

假设您的时区值都是匹配表的所有偏移量(如果匹配表显示 01:00 并且您的时区为 -1,则您的本地时间将为 00:00),这里有一些代码会显示文本以你想要的方式:

function availablePeople(startTime, dayOfWeek) { //All slots are 1 hour long
  const sheetsNames = ["person1", "person2", "person3", "person4"]; //Edit this to update possibilities
  const dayHeaderRow = 2;
  const startTimeCol = 1;
  const endTimeCol = 2;

  var sheets = SpreadsheetApp.getActive();

  var referenceHourRow = sheets.getSheetByName("match").getRange(dayHeaderRow+1, startTimeCol, 24).getValues().map(function (x) {return x.toString()}).indexOf(startTime.toString());

  var referenceDayCol = sheets.getSheetByName(sheetsNames[0]).getRange(dayHeaderRow, endTimeCol+1, 1, 7).getValues()[0].indexOf(dayOfWeek);

  var availablePeople = 0;

  if (referenceHourRow != -1) {
    for (var i = 0; i<sheetsNames.length; i++) {
      var personSheet = sheets.getSheetByName(sheetsNames[i]);
      var timezone = -personSheet.getRange(1, 4).getValue();

      var thisDayCol = referenceDayCol;
      var thisHourRow = referenceHourRow;

      if (timezone!=0) {
        if (thisHourRow+timezone<0) {
          //Went back a day.
          thisDayCol = (thisDayCol+6)%7;
          thisHourRow = 24-(referenceHourRow-timezone);
        } else if (thisHourRow+timezone>=24) {
          //Went forward a day
          thisDayCol = (thisDayCol+1)%7;
          thisHourRow = (thisHourRow+timezone)%24;
        } else {
          thisHourRow += timezone;
        }
      }

      var cell = personSheet.getRange(dayHeaderRow+1+thisHourRow, endTimeCol+1+thisDayCol);

      if (cell.getValue()=="Available") {
        availablePeople++;
      }
    }
  }

  return availablePeople+" out of "+sheetsNames.length;
}

这个函数的使用方法如下:=availablePeople(&lt;START TIME&gt;,&lt;DAY OF THE WEEK&gt;)

要允许拖动和自动完成,请在“星期一”“00:00”中写入=availablePeople($A3,C$2),然后水平和垂直拖动以更新公式。

【讨论】:

  • =availablePeople($A3,C$2)(即星期一 00:00)。根据 OP 的测试数据,我得到“三分之一”。你同意? OP数据中的3个人是谁?
  • 如果函数有任何问题,我正在对其进行测试,但我在想的几乎是 ZektorH 编码的内容。我已经为它竖起了大拇指。
  • 你好@Tedinoz,我在处理这个问题时输入了我自己的测试数据。另外,Luís Fernando,请记住接受对您有帮助的答案,因为这有助于 Stack Overflow 用户找到正确答案。
  • 您好@LuísFernando,请注意,Google 表格不会使用未更改参数的公式更新单元格。要强制执行此更新,请删除包含公式的单元格并撤消该操作(恢复它们)。让我知道是否可以解决问题。
  • 您可以通过create a macrotrigger 对这些单元格执行更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多