天道酬勤,学无止境

Google Apps 脚本 - createEvent 函数未创建日历事件(Google Apps Script - createEvent function not creating calendar event)

问题

我们正在尝试使用 Google 表单创建一个在线表单来接受约会请求。 这个过程应该是这样的:

  1. 用户填写表格并提交他们的信息(这有效)
  2. 一封电子邮件被发送到我们的 Gmail 以通知我们新的传入请求(这有效)
  3. 我们进入谷歌电子表格。 有3张。 一张名为Requests 的工作表。 另一个称为Accepted 。 另一个叫做Rejected (这些是创建的)
  4. Requests 表中的最后一列有一个下拉菜单,其中包含 Accepted 或 Rejected 的值。 根据我们的选择,它会将整行移动到适当的工作表中——接受或拒绝。 (这一直工作到下面的第 5 步)
  5. 如果该行被移动到 Accepted,它应该创建一个新的日历事件。 这是不起作用的部分。 该行被正确移动到 Accepted 工作表中,但不会创建新的 Google 日历事件。

奇怪的是,如果我们手动运行该函数,它会起作用。 它获取最后一行并创建一个事件。 如果我们尝试通过我们的代码直接调用函数来直接运行该函数,则它不会创建事件。 这是我们的 moverow.gs 代码

(请注意,所有机密的识别信息都已被删除,例如日历 ID):

function onEdit(e) {
  try { moveRow(e) } catch (error) { Browser.msgBox(error) }
}

function moveRow(e) {

  var rowStart = e.range.rowStart;
  var colStart = e.range.columnStart;

  var calendarStaff1Id = "<link to calendar>";
  var calendarStaff2Id = "<link to calendar>"
  var calendarStaff3Id = "<link to calendar>"
  var calendarStaff4Id = "<link to calendar>"

  if ( rowStart == e.range.rowEnd && colStart == e.range.columnEnd ) {
    var active = e.source.getActiveSheet();
    var name = active.getName();

    if ( name == "Requests" && colStart == 10 ) { 
  var value = e.value;

  if ( value == "ACCEPTED (S1)" ) {
    var rowValues = active.getRange( rowStart + ':' + rowStart ).getValues();
    e.source.getSheetByName("Accepted").appendRow(rowValues[0])
    active.deleteRow(rowStart);
    var calendarId = calendarStaff1Id;
    addEvent();

  }

  if ( value == "ACCEPTED (S2)" ) {
    var rowValues = active.getRange( rowStart + ':' + rowStart ).getValues();
    e.source.getSheetByName("Accepted").appendRow(rowValues[0])
    active.deleteRow(rowStart);
    var id = calendarStaff2Id;
    addEvent();

  }

  if ( value == "ACCEPTED (S3)" ) {
    var rowValues = active.getRange( rowStart + ':' + rowStart ).getValues();
    e.source.getSheetByName("Accepted").appendRow(rowValues[0])
    active.deleteRow(rowStart);
    var calendarId = calendarStaff3Id;
    addEvent();

  }

  if ( value == "ACCEPTED (S4)" ) {
    var rowValues = active.getRange( rowStart + ':' + rowStart ).getValues();
    e.source.getSheetByName("Accepted").appendRow(rowValues[0])
    active.deleteRow(rowStart);
    var calendarId = calendarStaff4Id;
    addEvent(calendarId);

  }

  if ( value == "REJECTED" ) {  // Change to the value that will trigger the move
    var rowValues = active.getRange( rowStart + ':' + rowStart ).getValues();  // Entire row
    e.source.getSheetByName("Rejected").appendRow(rowValues[0])  // Change to your "move to" sheet name
    active.deleteRow(rowStart);
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Rejected").activate();

    Browser.msgBox("Please contact client to let them know that their request cannot be fulfilled");

      }
    }
  }
}

function addEvent(calendarId) {

    var startDtId = 7;
    var titleId = 2;
    var titleId2 = 6;
    var descId = 8;
    var formTimeStampId = 1;

    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Accepted").activate();

    // Switch to sheet Accepted and start the calendar event creation
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Accepted");
    var rows = sheet.getDataRange();
    var numRows = rows.getNumRows();
    var values = rows.getValues();
    var lr = rows.getLastRow();
    var startDt = sheet.getRange(lr,startDtId,1,1).getValue();
    var subOn = "Added :"+sheet.getRange(lr,formTimeStampId,1,1).getValue()+" by: "+sheet.getRange(lr,titleId,1,1).getValue();
    var desc = "Comments :"+sheet.getRange(lr,8,1,1);
    var title = sheet.getRange(lr,titleId,1,1).getValue()+" - "+sheet.getRange(lr,titleId2,1,1).getValue();
    var start = new Date(startDt);
    var end = new Date(startDt.valueOf()+60*60*1000);
    var loc = 'Central Library';

    var cal = CalendarApp.getCalendarById(calendarId);

    //Browser.msgBox("Please add the following event into your calendar: " + title + " Start Time: " + start + " End Time: " + end);

    var event = cal.createEvent(title, start, end);

};

请帮忙!! 我们已经无计可施了。 提前致谢。

回答1

一个简单的onEdit()触发器不能做任何需要授权的事情。 谁拥有脚本所在的文档并不重要; 如果它是一个简单的触发器,那么它就是匿名的。

相反,请使用可安装的触发器。 (您可以简单地重命名您的函数,然后按照手动管理触发器中的说明进行设置。)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用Google Apps脚本编辑Google日历活动时更新与会者(Update attendees when editing a Google calendar event with Google apps script)
    问题 情况 我有一个日历,上面有很多事件(工作人员评估)。 我已经做了很多修改(更改活动时间等),但是邀请函发给了拥有莲花笔记日历的人(贫穷的人)。 这意味着除非我触发所谓的“发送通知”? 在您的鼠标单击版本中,他们无法知道该事件已更新。 (类似Q) 在此示例中,我尝试触发的事件与“发送更新?”时触发的事件相同。 发送接受模态。 代码 这是一些示例代码,这些代码获取“ Appraisals日历上的所有事件并将其位置更改为“月球”。 function fixInvitations(){ //get the callendar named "Appraisals" var cApp = CalendarApp.getCalendarsByName("Appraisals")[0]; var events = cApp.getEvents(new Date(), new Date("Dec 30 2014")); for (eIndex in events){ var event = events[eIndex]; event.setLocation("the moon"); } } 问题 如何触发所有受邀参加活动的各方的更新,以使更改反映在他们的日历中? 目前,这些事件现在已在月球上,但更新尚未告知非Google日历上的人员有关此更改的信息。 有用,但不是有用的事实
  • Google Apps 脚本将事件从一个日历移动到另一个日历(Google Apps Script Move Event From One Calendar To Another)
    问题 我在这里查看了Mogsdad对类似问题的回答,但这并不是特别针对我的问题。 我还查看了 Calendar 类及其子类的文档,但没有将单个事件从 Calendar X 复制到 Calendar Y 的方法(在我看来应该实现;有一个待处理的功能请求)。 我想要做的是如下: 将要移动的日历事件的 ID 存储在某处。 当事件 Z 完成时(外部标准,不是基于时间的),为函数提供日历事件 ID。 该函数会将事件 Z 从日历 X 移动到日历 Y。 我能想到的唯一方法是马虎(下面是半伪): // y is Calendar Y, z is the ID of Event Z function moveToNewCalendar(y, z) { var eventToMove = getEventByID(z); // eventDetails is an Object var eventDetails = getAllEventDetails(eventToMove); // This is not fun! y.createEvent(eventDetails); eventToMove.deleteEvent(); } function getAllEventDetails(e) { var details = {}; details["title"] = e.getTitle()
  • 错误:“您在短时间内创建或删除了太多日历或日历事件。”(Error: “You have been creating or deleting too many calendars or calendar events in a short time.”)
    问题 第一次在这里问一个问题。 我已经构建了一个Google App脚本,该脚本从Google表格中获取事件信息,并根据@Mogsdad在此处的答案在Google日历上创建事件。 (由于不存在声誉,我无法在该线程上发布问题) 第一次,“ exportEvents”功能运行良好。 但是,一旦电子表格具有更多行的信息,它就不会完成脚本,而是说“您在很短的时间内创建或删除了太多的日历或日历事件。请稍后重试。” 这与Google设置的每日配额无关,因为我每天不会创建将近10,000个事件的内容。 我搜索了一个解决方案,并在@ JEvans-GSA的Google产品论坛上找到了该解决方案,他的脚本基于像我一样的@Mogsdad脚本。 我调整了他的解决方案,并将“ updateEvents”功能与“ exportEvents”分开(还创建了“ deleteEvents”功能)。 现在,“ exportEvents”不会遇到“您在短时间内创建或删除太多日历或日历事件。请稍后重试”的问题。 但是,“ updateEvents”在执行过程中仍然会收到相同的警告! 例如,我创建了83个标题为“ 1”至“ 83”的事件,并将这些事件成功导出到日历中。 然后,我将事件标题从“ 100”更改为“ 182”,并尝试更新事件。 它仅将“ 1”〜“ 15”更新为“ 101”〜“ 114”,其他所有内容保持不变。
  • 从电子表格创建Google日历活动,但防止重复(Create Google Calendar Events from Spreadsheet but prevent duplicates)
    问题 我正在尝试编写一个脚本,该脚本将从Google电子表格中获取数据并在我的Google日历中创建事件。 我管理得很好,但是每次运行它都会产生重复。 因此,现在我试图通过在电子表格中创建第17列来为每行自动生成唯一的事件ID来防止这种情况,然后每次运行脚本时,它将查看每行的事件ID并删除相应的事件在日历中重新创建原始数据或更新后的数据(如果我更改了该行)。 我是任何一种脚本的新手,都将它们拼凑在一起,但是现在却碰壁了。 谁能帮忙解决这个问题? function CalInsert() { var cal = CalendarApp.getDefaultCalendar(); var id = SpreadsheetApp.getActiveSheet().getRange(2,17).getValue(); if (id != 0) { var event = cal.getEventSeriesById(id); event.deleteEventSeries(); } var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = sheet.getLastRow(); // Number of rows to
  • Google Apps 脚本:event.setTime 错误和时间格式(Google Apps Script: event.setTime error and time format)
    问题 我正在创建一个几乎完整的预订系统。 目前我正在从表单中收集数据,将其传递到工作表,然后使用其中的一些信息来创建日历事件。 这一切正常。 在创建事件时,我还会收集 eventID,以便我可以使用它来识别事件并从电子表格中更新它。 这些更新也有效,但更新开始/结束日期和时间会导致以下错误: 类型错误:在对象 CalendarEventSeries 中找不到函数 setTime。 这是我正在使用的代码: var eventStart = sh.getRange("D"+rowNumber).getValues(); var eventEnd = sh.getRange("E"+rowNumber).getValues(); event.setTime(eventStart, eventEnd); 我正在使用setLocation和setTitle进行完全相同的操作,没有任何问题。 我是新手,我不知道对象是什么,所以错误消息对我来说意义不大! 但我可以看到 setTime 是类 'CalendarEvent' (https://developers.google.com/apps-script/reference/calendar/calendar-event#setTime(Date,Date)) 中概述的方法,但不是'日历事件系列'。 反正我所有的事件都是开关事件?
  • 从电子表格创建Google日历定期活动(Create Google Calendar Recurring Events from Spreadsheet)
    问题 底部是上一个博客的代码,效果很好! 此代码是通过以下Google表格标题设置的: Date | Title | Start Time | End Time | Location | Description | EventID 但是,我需要具有创建重复事件的能力。 新的Google工作表标题如下: Date | Title | Start Time | End Time | Location | Description | Type | Recurring | EventID 如果Type =“ PM”(新列),每月数个“重复”(也是新列),我需要创建重复事件。 怎么可能在每次运行脚本时都没有重复的情况? /** * Adds a custom menu to the active spreadsheet, containing a single menu item * for invoking the exportEvents() function. * The onOpen() function, when defined, is automatically invoked whenever the * spreadsheet is opened. * For more information on using the Spreadsheet API, see *
  • Google Apps脚本以打开URL(Google Apps Script to open a URL)
    问题 有没有一种方法可以编写Google Apps脚本,因此在运行时,第二个浏览器窗口会打开www.google.com(或我选择的其他网站)? 我想在这里解决我的上一个问题:我可以在Google Apps电子表格的消息框内添加超链接吗? 回答1 您可以构建一个小型的UI来完成以下工作: function test(){ showURL("http://www.google.com") } // function showURL(href){ var app = UiApp.createApplication().setHeight(50).setWidth(200); app.setTitle("Show URL"); var link = app.createAnchor('open ', href).setId("link"); app.add(link); var doc = SpreadsheetApp.getActive(); doc.show(app); } 如果要“显示” URL,只需像下面这样更改此行: var link = app.createAnchor(href, href).setId("link"); 编辑:以只读方式链接到演示电子表格,因为太多的人继续在上面写一些不需要的东西(只需制作一个副本即可使用)。 编辑
  • 如何使用脚本同步Google日历和电子表格(How to synchronize Google Calendar & Spreadsheet with Script)
    问题 我正在尝试创建一个Google Apps脚本,以使Google日历和云端硬盘上的“主电子表格”保持同步-这可能吗? 我发现了这两篇文章: http://blog.ouseful.info/2010/03/04/maintaining-google-calendars-from-a-google-spreadsheet/ http://blog.ouseful.info/2010/03/05/grabbing-google-calendar-event-details-into-a-spreadsheet/ 我很确定这可以使用很多if语句和逻辑来完成,但是也许有更简单的方法吗? 我最后只提供了以下简单脚本。 真正需要做的就是添加基于两列的事件,这将花费很长时间来开发。 function onOpen() { //spawns a menu with a button that triggers AddToCal var sheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [{ name : "Add event to calendar", functionName : "AddToCal" }]; sheet.addMenu("Data To Calendar Plugin", entries); }
  • 使用 Google Apps 脚本的 Gmail 短信通知:如何显示电子邮件的内容?(SMS notification for Gmail using Google Apps Scripts: how to display content of the email?)
    问题 每次收到符合特定条件的电子邮件时,我都在处理 SMS 通知; 我决定为此使用 Google App Scripts。 我特别受到以下文章 https://developers.google.com/apps-script/articles/gmail_filter_sms 的启发。 我还在 StackOverflow SMS Alerts for Important Mails in Gmail 中查看了相关问题。 我通过在下次运行脚本时清理事件来改进来自 developer.google.com 的原始脚本(每次运行脚本时我都会收到 SMS 警报)。 该脚本目前正在使用标签“SendText”并在日历“AlertSMS”中创建事件。 但是,我收到的 SMS 仅包含电子邮件的主题和作者:我需要显示电子邮件的内容(或至少是其中的一部分)。 我尝试将它添加到事件的描述中,但没有运气。 有没有人知道如何做到这一点? 下面是我的脚本代码: function sendText() { var now = new Date().getTime(); // Delete old events var events = CalendarApp.openByName('AlertSMS').getEvents(new Date('January 1, 2010 EST'), new Date
  • 如何使用 Google Apps 脚本读取日历事件重复设置(How to Read Calendar Event Recurrence Settings Using Google Apps Script)
    问题 我似乎无法弄清楚如何使用 Google Apps 脚本读取CalendarEventSeries重复设置。 有一个 setRecurrence 方法; 我正在寻找类似getRecurrence东西,希望它能返回一个表示 EventSeries 重复设置的 EventRecurrence 对象。 有任何想法吗? 为什么我需要这个? 我只是想将一个事件从一个日历复制到另一个日历,保留重复设置(如果有)。 回答1 尝试使用 Calendar API 而不是内置的日历库。 API 公开了更多信息。 https://developers.google.com/google-apps/calendar/v3/reference/events/instances
  • 如何在电子表格的Google Apps脚本中监视点击事件?(How can you monitor for click events in Google Apps script for spreadsheets?)
    问题 我正在使用脚本管理Google电子表格。 onEdit正常工作-我可以将 SpreadsheetApp.getActiveRange().setBackgroundRGB(255, 0, 0); 在onEdit函数中。 我想将相同的代码放在onClick函数中,以便当用户单击单元格时,它立即变为红色。 这可能吗? 我在文档中找不到任何方法。 回答1 如前所述,目前尚无办法为Google Spreadsheets创建onClick()函数。 由于Google App脚本函数是在服务器中处理的,因此这是有道理的,由onClick()事件执行产生的负载量将很容易耗尽默认情况下提供的所有请求配额。 您应该使用文档来创建按钮并单击它。 回答2 您可以近距离接触。...使用诸如“完成”之类的选项为单元格创建一个验证。 点击下拉菜单,选择完成。 现在创建要触发的onChange或onEdit触发器。 您可以获取单元格/范围的上下文相关函数....就像在行或列上触发。 这很容易复制和编程 回答3 您可以将图形添加为按钮-https://developers.google.com/apps-script/guides/menus#clickable_images_and_drawings_in_google_sheets 回答4 我相信新的触发器onSelectionChange(e
  • 如何在Google日历中添加“邀请我”链接(How to add add “Invite Me” link in Google Calendar)
    问题 我发现有人在Google日历中添加了“邀请我”链接,如下所示。 我已尽力而为,但是当有人单击事件时找不到添加此链接的方法。 回答1 Molk是正确的,您将需要setAnyoneCanAddSelf(true)。 我将如何将其部署为一个Web应用程序,该脚本需要一个用于日历事件ID,Session.getActiveUser()。getEmail()的查询参数,并将其添加到日历事件中。 我将在主日历的“描述”字段(如您的屏幕快照)中创建URL,并在已部署的脚本URL上添加URL,并为id添加查询参数。 一个例子看起来像这样: var calId = 'yourdomain.com_459nd7pqmn5irsqgn8p91febe4@group.calendar.google.com'; function inviteMe(){ try{ var cal = CalendarApp.getCalendarById(calId); var start = new Date(); var end = new Date(); start.setHours(13); end.setHours(14); var event = cal.createEvent("Add Me Test", start,end); event.setAnyoneCanAddSelf(true); var
  • 如何调试Google Apps脚本(又称Logger.log记录到哪里?)(How to debug Google Apps Script (aka where does Logger.log log to?))
    问题 在Google表格中,您可以添加一些脚本功能。 我为onEdit事件添加了一些内容,但无法确定它是否有效。 据我所知,您无法从Google Sheets调试实时事件,因此您必须从调试器进行调试,这毫无意义,因为如果我运行,传递给我的onEdit()函数的事件参数将始终是未定义的它来自Script Editor 。 因此,无论何时调用onEdit函数,我都试图使用Logger.log方法记录一些数据,但这似乎也仅在从Script Editor运行时才起作用。 当我从Script Editor运行它时,可以通过查看View->Logs...来查看View->Logs... 我希望能够看到事件实际执行时的日志,但是我无法弄清楚。 我该如何调试这些东西? 回答1 更新: 就像在这个答案中写的那样, Stackdriver Logging是现在首选的日志记录方法。 使用console.log()登录到Stackdriver。 Logger.log会(最终)向您发送一封电子邮件,提示您脚本中发生的错误,或者,如果您正在通过Script Editor运行Script Editor ,则可以通过查看View->Logs查看上次运行函数的View->Logs (仍在脚本编辑器中)。 同样,这只会显示您从Script Editor内部运行的最后一个函数记录的任何内容。
  • 如何使用Google脚本将日历事件复制(复制)到另一个日历中?(How can I copy (duplicate) a calendar event into another calendar using Google Script?)
    问题 我在Google日历中有几个日历。 我正在学习Google脚本,并且想创建一个脚本,将一个事件从一个日历复制到另一个日历,并有机会修改诸如重复发生之类的参数。 回答1 一些以以下代码开头的代码: function myFunction() { var calendarSource = CalendarApp.getCalendarById("calendarID"); var calendarDestination = CalendarApp.getCalendarById("calendarID"); var eventToCopy = calendarSource.getEvents(new Date("July 21, 2009 EST"), new Date("July 22, 2009 EST")); //read up: https://developers.google.com/apps-script/class_recurrence var newRecurrence = CalendarApp.newRecurrence().addWeeklyRule().times(10); for (var i in eventToCopy){ if (eventToCopy[i].getTitle() == "event name"){ var newEvent =
  • Google App 脚本错误:您无权调用 getActiveForm?(Google App Script Error: You do not have permission to call getActiveForm?)
    问题 我正在创建一个脚本,该脚本从表单中获取信息并将其写入日历。 当我在脚本编辑器中运行脚本时,它运行良好,从电子表格中获取信息并创建日历事件。 但是,当我填写表单并提交(提交是触发器)时,我收到一条错误消息,指出我无权调用 getActiveForm()。 我拥有表格和日历。 我很欣赏任何想法。 代码 function createEvent() { var calendarToUse = "testing"; var ssUrlToUse ='https://docs.google.com/a/bay.k12.fl.us/spreadsheets /d/1ZTDQL9G5U7RqbbKQbAfb3ERqFwpSsC3EOQxdD1zdQwA/edit#gid=441997215'; /* Get Canalnder*/ var calen = CalendarApp.getCalendarsByName(calendarToUse); var cal = calen[0]; Logger.log(cal.getName()); /* get info from responses*/ var mySS =SpreadsheetApp.openByUrl(ssUrlToUse).getActiveSheet() Logger.log(mySS.getName()); var
  • 如何扩展Google Apps脚本类(How to extend Google apps script classes)
    问题 我试图在脚本中扩展Sheet类,并且在尝试执行以下操作时得到Sheet是未定义的: Sheet.prototype.moveColumn = function(SourceIndex, DestinationIndex){ var source = this.getRange(1, SourceIndex, ss.getLastRow(), 1).getValues() var move = SourceIndex-DestinationIndex>0 ? sheet.getRange(1, DestinationIndex, ss.getLastRow(), SourceIndex-DestinationIndex).getValues() : sheet.getRange(1, SourceIndex, ss.getLastRow(), DestinationIndex-SourceIndex).getValues(); sheet.getRange(1, DestinationIndex, source.length, 1).setValues(source); SourceIndex-DestinationIndex>0 ? sheet.getRange(1, DestinationIndex+1, move.length, move[0].length)
  • 在Google Apps脚本中调试自定义功能(Debugging a custom function in Google Apps Script)
    问题 我正在尝试在Apps脚本中为Google Spreadsheet创建我的第一个自定义函数,而使用调试器时遇到了麻烦。 我正在使用Google文档中的自定义函数演示代码,并且已在电子表格单元格中使用的自定义函数drivingDistance(origin, destination)中设置了一个断点。 我遇到的问题是,调试器将传递给函数的参数显示为undefined 。 但是,可以正确显示执行期间创建的任何其他变量的内容(只要它们不依赖于输入参数)。 有趣的是,尽管输入参数显示为未定义,但函数的计算成功,因此这似乎是调试器问题。 不幸的是,这个问题使我无法成功学习创建和调试自己的代码(因为我将不得不使用复杂的输入参数)。 我感觉到问题与服务器脚本的服务器端执行有关,因此我尝试使用Logger类记录输入参数,并且还尝试将这些变量复制到新的本地变量中。 但是我想出的一切都是undefined 。 另一个奇怪的提示是,参数的typeof返回String 。 但是获取它们的长度会引发错误,并尝试将它们与另一个字符串连接起来会返回字符串“ undefined”(请参阅​​我的屏幕转储)。 我正在寻找有关正在发生的事情的见解。 回答1 调试器可能不是骗你的-如果您在调试器中启动该功能,它将没有任何参数传递给它。 不用担心,您只需要确保获得用于调试的值即可。 看一看如何在GAS中测试触发功能
  • 提交Google表单(Google Forms onsubmit)
    问题 如何引用默认的“提交”表单按钮将“ onsubmit”触发器与另一操作链接? 谢谢你。 例如,使用onsubmit, Logger.log('do something'); 回答1 一个没有。 表单服务不允许对该产品进行任何程序控制。 在此常规主题的问题跟踪器上有一个未解决的问题。 对其加注星标以进行“投票”,并接收更新。 但是,您不会迷路。 在接收表单响应的电子表格中,您可以添加带有可安装触发器的脚本,以触发“表单提交”。 从那里,您可以对提交的数据执行许多操作,包括根据需要进行日志记录...但是对表单本身则无济于事。 这些参考资料说明了触发器和事件。 使用特定于容器的可安装触发器了解事件 回答2 我没有将脚本添加到电子表格以接收来自表单的响应(如Mogsdad的回答),而是添加了一个由表单的“提交”按钮触发的脚本。 第1步:首先创建Google表单 步骤2:然后从菜单中,单击“工具”->“脚本编辑器” 步骤3:给您的函数起一个类似onSubmit()的名称 第4步:编写一些代码以发送类似这样的电子邮件,然后通过单击“运行”按钮进行测试 function onSubmit() { MailApp.sendEmail("fred@email.com,alice@email.com", "Subject", "A new application has been
  • Google App Script Web App上的并发命中或并发执行次数是否有限制(Is there any limit on number of concurrent hits or simultaneous executions on Google App Script Web App)
    问题 我正在编写一个Apps脚本(以处理电子邮件,任务和日历事件),并希望将其部署为Web App。 该应用程序将在运行它的用户的上下文中运行。 该应用程序将由超过1万名用户使用,甚至可能更多。 在将其分发给用户之前,我想知道Web应用程序可以同时点击的次数是否受到限制? 如果运行Web应用程序脚本的用户在这种情况下可以解决此限制,或者我的(脚本所有者)限制可以适用? 如果未达到此处描述的限制,我是否可以假定它可以扩展以满足10k +用户的需求? 有任何与之相关的想法或经验吗? 回答1 如果您正在寻找此问题的解决方案,那又如何呢? 我使用可以运行异步处理的fetchAll方法测量了Web Apps的并发连接数。 流程如下。 部署Web应用程序。 通过异步处理连接到Web Apps。 那时,作为连接数量的工人数量发生了变化。 从Web Apps返回结果时,检索错误数。 此实验的示例脚本: 客户端脚本:Google Apps脚本 var workers = 10; // Number of workers var object = []; for (var i = 0; i < workers; i++) { object.push({ "url": "https://script.google.com/macros/s/#####/exec", "method": "get",
  • Google Apps 日历显示“忙碌”而不是分享完整的更多详细信息(Google Apps Calendar shows “Busy” instead of sharing full, more details)
    问题 我们正在构建一个多用户平台,其中每个注册用户都有一个带有电子邮件和日历的 Google App 帐户。 人们可以将事件添加到日历,但条目始终显示“忙碌”而不是显示完整的事件详细信息。 如何让日历共享和显示不仅仅是“忙碌”和列出事件名称? 回答1 首先登录您的 Google Apps 域管理员帐户。 组织管理员 URL 为https://google.com/a/yourdomainname.com 转至应用程序 > 日历 > 共享设置或此处(替换您的域):https://admin.google.com/yourdomainname.com/AdminHome?fral=1#AppDetails:service=Calendar 选择共享所有信息,但外人无法更改日历 然后使用日历登录用户帐户。 新设置需要 5 分钟才能对用户帐户生效。 我注销并返回几次,刷新等。最终,用户帐户上的日历共享设置将允许您将默认的“仅查看空闲/忙碌(隐藏详细信息)”选项更改为“查看所有事件详细信息”和你完成了。 回答2 这是设置日历共享选项的更新链接。 这必须由管理员在组织范围内完成。 选项是 仅空闲/忙碌信息(隐藏事件详细信息):用户可以允许域外的人知道他们何时忙碌或有空,但事件详细信息是隐藏的。 私人地址对用户的日历是隐藏的。 共享所有信息,但外部人员无法更改日历