【问题标题】:Google Apps Script - createEvent function not creating calendar eventGoogle Apps 脚本 - createEvent 函数未创建日历事件
【发布时间】:2014-11-28 10:37:48
【问题描述】:

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

  1. 用户填写表格并提交他们的信息(这可行)
  2. 会向我们的 Gmail 发送一封电子邮件,通知我们有新的传入请求(可行)
  3. 我们进入 Google 电子表格。有3张。一张名为Requests的工作表。另一个称为接受。还有一个叫做Rejected(这些都是创建的)
  4. “请求”表中的最后一列有一个下拉菜单,其中包含已接受或已拒绝的值。根据我们选择的内容,它会将整行移动到适当的工作表中——接受或拒绝。 (这一直有效到下面的第 5 步)
  5. 如果该行被移动到 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);

};

请帮忙!!我们束手无策。提前致谢。

【问题讨论】:

  • 我不在我的电脑上写完整的回复,但乍一看它可能是 OnEdit 触发器,它仅在手动编辑工作表时有效,而不是通过脚本。您是否希望它在手动或通过脚本编辑工作表时运行?
  • 感谢您的回复。如前所述,一旦我从下拉菜单中选择一个值,该行就会从 Requests 表正确移动到 Accepted 表。奇怪的是,如果我注释掉日历代码块并重新启用 Browser.msgbox 行,我会得到一个弹出框,其中包含正确传递的值。无论出于何种原因,无论我使用什么代码来创建日历事件,它都不会创建该事件。我什至在启动新的 Apps 脚本文件时复制并粘贴了 Google 的日历模板代码。没有任何效果。如果我们在编辑器中手动运行该函数,它就可以工作。奇怪
  • 我们希望代码最终能够使用上述脚本运行。我们希望它尽可能自动化。我们不想进入脚本编辑器并手动运行该功能。手动运行该函数也会创建重复项。理论上,如果代码只在我们从下拉列表中选择时运行,它应该只选择最后一行并创建一个没有重复的事件。
  • 酷,很高兴知道。如果到我回家时没有人回答这个问题,我会仔细看看。顺便说一句,您的“if”语句存在差异,只有“ACCEPTED (S4)”if 语句实际上将 calendarId 作为 'addEvent(calendarId);' 传递,其余的似乎没有像 'addEvent(); 那样传递 calendarId 值; '。一目了然可能是问题的一部分。
  • 是的,刚刚注意到。我的经理和我一样在玩代码。最初,所有 If 语句都是相同的(在 addEvent 中具有 calendarid),但仍然没有创建日历事件。感谢您注意到这一点。我现在要修复代码。我几乎感觉到这是日历本身的权限问题,但日历设置为正在使用的 Google 帐户的“进行更改并管理共享”。感谢您抽出宝贵的时间。非常感谢任何帮助。

标签: javascript google-apps-script calendar


【解决方案1】:

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

改为使用installable trigger。 (您可以简单地重命名您的函数,然后按照Managing Triggers Manually 中的说明进行设置。)

【讨论】:

  • Mogsdad,感谢您的回复。我只是用谷歌搜索了“程序触发器”,但搜索中没有真正出现。我们如何按照您的建议进行操作?抱歉,我们是编写 Apps 脚本的新手。谢谢
  • 莫格达。问题。我应该重命名哪个函数?我宁愿尝试以编程方式执行触发器,但我所做的一切似乎都不起作用。我感到非常沮丧,因为我们已经为此工作了将近两个星期。我试过了,但它不起作用function createSpreadsheetEditTrigger() { var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Accepted"); ScriptApp.newTrigger('addEvent').forSpreadsheet(ss).onEdit().create(); }
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多