繁体   English   中英

Google工作表-如何根据同一行的编辑URL的索引获取列的行索引?

[英]Google sheets - How to get row index of a column, based on the index of edit URL from the same row?

我正在使用 Google forms 和 Google 日历的组合编写房间预订系统。

当有新的预订订单时:

  • 将在所选日历上自动创建一个事件。
  • 还将自动生成编辑响应 URL 并将其放入电子表格的第 10 列,与插入表单答案的同一行。
// This is the function to generate the edit URL (which works perfectly).

function getEditUrl(request) {
    var formRes = FormApp.openById('XXXXXXXXXXXXXXXXXXXXXXXXXXXX');
    var sheetRes = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('YYYYYYYYYY');
    var data = sheetRes.getDataRange().getValues();
    var urlCol = 10;
    var responses = formRes.getResponses();
    var timestamps = [],
        urls = [],
        resultUrls = [];
    for (var i = 0; i < responses.length; i++) {
        timestamps.push(responses[i].getTimestamp().setMilliseconds(0));
        urls.push(responses[i].getEditResponseUrl());
    }
    for (var j = 1; j < data.length; j++) {
        resultUrls.push([data[j][0] ? urls[timestamps.indexOf(data[j][0].setMilliseconds(0))] : '']);
    }
    sheetRes.getRange(2, urlCol, resultUrls.length).setValues(resultUrls);
};

但是,当订单超过2个时会出现问题; 因为下一个订单将从上一个订单中删除日历事件。

// This is the function to update the calendar event. 

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('XXXXXXXXXXXXXXXXXXXXXXXX@group.calendar.google.com');
    for (var i = 0; i < responses.length; i++) {
        getConflicts(request);
        if (request.eventConflict == "conflict") {
            sheet.getRange(lastRow, 11).setValue("conflict");
            break;
        } else if (request.eventConflict == "approve") {
            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);
            break;
        }
    }
    for (var j = 1; j < values.length; j++) {
        if (values[j][10] == "approve") {
            var eventEditId = calendar.getEventSeriesById(values[j][11]);
            eventEditId.deleteEventSeries();
            sheet.getRange(j + 2, 11).setValue("");
            getConflicts(request);
            if (request.eventConflict == "approve" && values[j][10].length > 1) {
                var newEvent = calendar.createEvent("booked", request.date, request.endTime);
                var newEventId = newEvent.getId().split('@')[0];
                sheet.getRange(j + 2, 11).setValue("approve");
                sheet.getRange(j + 2, 12).setValue(newEventId);
                break;
            } else {
                sheet.getRange(j + 2, 11).setValue("conflict");
                break;
            }
        }
    }
};

我的问题:

  1. 如何确保当受访者编辑他/她自己的回复时,它总是会从与编辑 URL 相同的列中更新事件? --> 我有单独的 function 会将编辑 URL 发送给受访者
  2. 当有两个以上提交时,第 3 次提交将删除第 2 次的事件。 (我确定问题出在 updateCalendar() 函数上)。

在过去的几天里,我一直在努力寻找提出最佳循环方法的最佳方法。 非常感谢任何帮助/响应。

编辑:

这是工作表的列描述(用 | 分隔):

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

这是在日历中获取事件冲突的 function:

function getConflicts(request){
  var conflicts = request.calendar.getEvents(request.date, request.endTime);
  if (conflicts.length > 0) {
    request.eventConflict = "conflict";
  } else {
    request.eventConflict = "approve"
  }
  };

这是将在表单提交时触发的主要 function:

function main(){
  var request = new Submission(lastRow);
  getEndTime(request);
  draftEmail(request);
  updateCalendar(request);
};

这是工作表的截图工作表的屏幕截图

最后,我找到了一种使用 e.range 方法检索编辑行的方法。 所以基本上我在同一个电子表格中创建了另一个工作表。 当有新的提交时,它会自动将新的提交复制到第二张表。 而当有一个编辑过的提交时,它会通过复制表找到编辑过的行,然后编辑它(以及日历)。 归功于泰迪诺兹

function updateCalendarTwo(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var responsename = "AAAAAAAAAAAAAAA"
  var copyname = "BBBBBBBBBBBB";
  var responsesheet = ss.getSheetByName(responsename);
  var copysheet = ss.getSheetByName(copyname);
  var calendar = CalendarApp.getCalendarById('CCCCCCCCCCCCCCCCCCCC');
  // 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");
        };
      };
  
    var revRange = copysheet.getRange(rRow,revCol);
    var revOldValue = revRange.getValue();
    if (revOldValue == null || revOldValue == ""){
      revOldValue = 0;
    }
    var revNewValue = revOldValue+1;
    revRange.setValue(revNewValue); 
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM