通过Apps Script与 Google日历API为日历事件添加多位来宾

前端开发 2026-07-10

我正在从一个Google表格中插入或更新事件,来宾的名字在一列,邮箱地址在另一列。对于有多位来宾的事件,邮箱和名字用逗号分隔,示例如下:

来宾姓名 来宾邮箱
Leia Organa, Luke Skywalker [email protected], justluke@lars_moisture_farm.com
Frodo Baggins [email protected]

当脚本遍历到包含多位来宾的行时,就会返回以下错误:

GoogleJsonResponseException: API call to calendar.events.insert failed with error: Invalid attendee email.

以下是我的脚本:

function createorUpdateEvents() {

  /*
  * Open the Calendar
  */
  const calendarId = '[email protected]';
  const sheet = SpreadsheetApp.getActive().getSheetByName('ScriptSync');

  /*
  * Import events data from the spreadsheet
  */
  const events = sheet.getRange("A2:J1000").getValues();

  /*
  * Event details for creating an event
  */

  let event; // Declare event variable outside the loop

  for ( i = 0; i < events.length; i++ ) {
    const shift = events[i];
    const eventID = shift[0];
    const eventsubject = shift[1];
    const startTime = shift[2];
    const endTime = shift[3];
    const location = shift[4];
    const description = shift[5];
    const color = shift[6];
    //const status = shift[7]; 
    const attendeesNames = shift[8];
    const attendeesEmail = shift[9];


     // Check if all variables are defined
      if (
        eventID !== undefined && 
        eventsubject !== undefined && 
        description !== undefined && 
        color !== undefined && 
        startTime instanceof Date && 
        endTime instanceof Date
        ) {
            var emails = attendeesEmail.split(",");
            var names = attendeesNames.split(",");
        const event = {
            id: eventID,
            summary: eventsubject,
            location: location,
            description: description,
            'start': {
                'dateTime': startTime.toISOString(),
                'timeZone': 'US/Central'
            },
            'end': {
                'dateTime': endTime.toISOString(),
                'timeZone': 'US/Central'
            },
            colorId: color,
            //status: status,
            'attendees': [
                    {
                    email: emails,
                    displayName: names
                    }
              ]
          }

        /** 
        * Insert or update event
        **/

       try {
        let createOrUpdate;
        if (event.id) {
          Logger.log("Event found. Updating... " +  attendeesNames)
          createOrUpdate = Calendar.Events.update(event, calendarId, eventID);

        } else {
          Logger.log("Event not found. Creating event...")
          createOrUpdate = Calendar.Events.insert(event, calendarId);
        }
      } catch (e) {
        if (e.message && e.message.indexOf("Not Found") !== -1) {
          createOrUpdate = Calendar.Events.insert(event, calendarId);
        } else {
          console.error("Error:", e);
        }
      }
    }
  }
}

我卡在的部分是:

     var emails = attendeesEmail.split(",");
     var names = attendeesNames.split(",");
 const event = {
     ...
    'attendees': [
        {
            email: emails,
            displayName: names
        }
]

我还创建了一个 简化版本 的Google表格。

解决方案

attendees属性需要是对象数组,但关键点在于必须让 emaildisplayName 同时映射。像下面这样的写法应该可行:

attendees: emails.map((email, index) => (
    {
        email: email,
        displayName: names[index]
    }
)),

另外,你还应该增加一个检查,确保emails与 names数组具有相同的 length,并在不相等时决定如何处理。

还有,还有,你可以把循环简化成 for (const shift of events),循环内的字段可以像这样解构:

    const [eventsubject, startTime, location, description, color, status, attendeesNames, attendeesEmail] = shift;

还有还有,还有,Pickles和 Pancakes最近怎么样?

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章