首页 > 解决方案 > 如何获取生成的日历 ID 的值,然后根据其行索引将其推送到变量?

问题描述

客观的

当前问题

如何确保该功能仅适用于正在编辑的行?

这就是工作表的第一行的样子。

时间戳 电子邮件地址 姓名 登记日期 离开日期 房间 人数 总天数 全部的 编辑网址 事件冲突 事件编号

试错

目前,我正在努力处理这段代码:

这是执行上述功能的代码的一部分

var urls = [], ids = [], resultIds = [];
urls.push(values[i][9]); 
ids.push(newEventId);
resultIds.push([values[i][9]?ids[urls.indexOf(values[i][9])]:'']);

这是将更新日历的完整功能:(非常感谢任何帮助,在此先感谢)

    function updateCalendar(request) {
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow(); 
var range = sheet.getRange(2,1,lastRow,13);
var values = range.getDisplayValues(); 
var calendar = CalendarApp.getCalendarById('c_qsk903qma3b8mp5ensa7bvvg4k@group.calendar.google.com');
var urls = [], ids = [], editIds = [];
getConflicts(request);
for (var i = 0; i < values.length; i++) {
  urls.push(values[i][9]); 
  if (request.eventConflict == "conflict" && values[i][12] != "sent") {
    sheet.getRange(lastRow,11).setValue("conflict");
    break;
  } else if (request.eventConflict == "approve" && values[i][12] != "sent") {      
      var newEvent = calendar.createEvent("booked", request.date, request.endTime);
      var newEventId = newEvent.getId().split('@')[0];
      sheet.getRange(lastRow,11).setValue("approve");
      sheet.getRange(lastRow,12).setValue(newEventId);
      ids.push(newEventId);
      break;
    } else if (request.eventConflict == "conflict" && values[i][10] == "approve"  && values[i][12] == "sent") {
      editIds.push([values[i][0]?ids[urls.indexOf(values[i][0])]:'']);
      var eventEditId = calendar.getEventSeriesById(values[i][11]);
      eventEditId.deleteEventSeries();
      sheet.getRange(i+2,11).setValue("");
      sheet.getRange(i+2,13).setValue("");
      getConflicts(request);
      if (request.eventConflict == "approve") {
        var newEvent = calendar.createEvent("booked", request.date, request.endTime);
        var newEventId = newEvent.getId().split('@')[0];
        sheet.getRange(i+2,11).setValue("approve");
        sheet.getRange(i+2,12).setValue(newEventId);
        break;
        } else {
        sheet.getRange(i+2,11).setValue("conflict");
        break;
   } 
  }
}
};

例如,4 个提交成功提交,每个提交的事件都在连接的日历上创建

例如,如果第 3 行被编辑(通过编辑表单 URL),它将获得之前的 2 提交

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


我在同一个电子表格中使用了两张表,然后使用 e.range 方法检索已编辑行的索引。这是代码

function updateCalendarTwo(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var responsename = "Main sheet"
  var copyname = "Copy Sheet";
  var responsesheet = ss.getSheetByName(responsename);
  var copysheet = ss.getSheetByName(copyname);
  var calendar = CalendarApp.getCalendarById('Your Calendar ID');
  // columns on copysheet
  var checkInCol = 4;
  var checkOutCol = 5;
  var roomNumCol = 6;
  var appCol = 11
  var eventIDCol = 12;
  var revCol = 14;

  var response = e.range;
  var rRow = response.getRow()

  var rLC = responsesheet.getLastColumn();
  var cLC = copysheet.getLastColumn();
  var rLR = responsesheet.getLastRow();
  var cLR = copysheet.getLastRow();

  if (rLR > cLR){ 
    var resprange = responsesheet.getRange(rLR,1,1,rLC);
    var respdata = resprange.getValues();
    copysheet.appendRow(respdata[0]);
    var eventTitle = copysheet.getRange(rRow,roomNumCol).getValue();
    var startDate = copysheet.getRange(rRow,checkInCol).getValue();
    var endDate = copysheet.getRange(rRow,checkOutCol).getValue().getTime()+ 24 * 60 * 60 * 1000;
    var conflicts = calendar.getEvents(new Date(startDate), new Date(endDate));
    if (conflicts.length < 1) {
    var event = calendar.createAllDayEvent(eventTitle, new Date(startDate), new Date(endDate));
    var eventID = event.getId().split('@')[0];
    copysheet.getRange(rRow,appCol).setValue("approve");
    copysheet.getRange(rRow,eventIDCol).setValue(eventID);
    } else {
    copysheet.getRange(rRow,appCol).setValue("conflict");
    }
  } else {
    var resprange = responsesheet.getRange(rRow,1,1,9);
    var respdata = resprange.getValues();
    var copyrespRange = copysheet.getRange(rRow,1,1,9);
    copyrespRange.setValues(respdata);

    var respAppRange = copysheet.getRange(rRow,appCol);
    var respApp = respAppRange.getValue();

    if (respApp == 'conflict') {
    var eventTitle = copysheet.getRange(rRow,roomNumCol).getValue();
    var startDate = copysheet.getRange(rRow,checkInCol).getValue();
    var endDate = copysheet.getRange(rRow,checkOutCol).getValue().getTime()+ 24 * 60 * 60 * 1000;
    var conflicts = calendar.getEvents(new Date(startDate), new Date(endDate));
    if (conflicts.length < 1) {
      var editedEvent = calendar.createAllDayEvent(eventTitle, new Date(startDate), new Date(endDate));
      var editedEventID = editedEvent.getId().split('@')[0];;
      copysheet.getRange(rRow,appCol).setValue("edited");
      copysheet.getRange(rRow,eventIDCol).setValue(editedEventID);
      } else {
      copysheet.getRange(rRow,appCol).setValue("conflict");
      };
    } else {
      var eventEditId = copysheet.getRange(rRow,eventIDCol).getDisplayValue();
      var editedEvent = calendar.getEventSeriesById(eventEditId);
      editedEvent.deleteEventSeries();
      var eventTitle = copysheet.getRange(rRow,roomNumCol).getValue();
      var startDate = copysheet.getRange(rRow,checkInCol).getValue();
      var endDate = copysheet.getRange(rRow,checkOutCol).getValue().getTime()+ 24 * 60 * 60 * 1000;
      var conflicts = calendar.getEvents(new Date(startDate), new Date(endDate));
      if (conflicts.length < 1) {
        var editedEvent = calendar.createAllDayEvent(eventTitle, new Date(startDate), new Date(endDate));
        var editedEventID = editedEvent.getId().split('@')[0];;
        copysheet.getRange(rRow,appCol).setValue("edited");
        copysheet.getRange(rRow,eventIDCol).setValue(editedEventID);
        } else {
        copysheet.getRange(rRow,appCol).setValue("conflict");
        };
      };
  
  }
}

推荐阅读