2014-11-27 4 views
1

Мы пытаемся создать онлайн-форму с помощью Google Forms, чтобы принимать заявки на встречи. Это то, что этот процесс должен выглядеть следующим образом:Сценарий Google Apps - createEvent, не создающий событие календаря

  1. Пользователь заполняет форму и передает сведения о них (это работает)
  2. электронное письмо отправляется в наш Gmail, чтобы сообщить нам о поступлении нового входящего запроса (это работает)
  3. Мы заходим в электронную таблицу Google. Есть 3 листа. Один лист под названием Запросы. Другой называется Принято. И еще один - Отклонено (они были созданы)
  4. В последней колонке на странице «Запросы» есть выпадающее меню со значениями «Принято» или «Отклонено». В зависимости от того, что мы выбираем, он переместит всю строку в соответствующий лист - либо «Принято», либо «Отклонено». (Это работает до шага 5 ниже)
  5. Если строка перемещается в Accepted, она должна создать новое событие календаря. Это та часть, которая не работает. Строка правильно перемещается в лист Accepted, но не создает новое событие календаря Google.

Странно, если мы запускаем функцию вручную, она работает. Он принимает последнюю строку и создает событие. Если мы попытаемся запустить функцию напрямую через наш код, вызвав функцию напрямую, она не создаст событие. Это наш код для moverow.gs

(обратите внимание, что вся конфиденциальная, идентифицирующая информация была удалена, таких как календарь идентификаторами):

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); 

}; 

Пожалуйста, помогите !! Мы в наших силах. Заранее спасибо.

+0

Я не на своем компьютере, чтобы написать полный ответ, но с первого взгляда это может быть триггер OnEdit, который ТОЛЬКО работает, когда лист редактируется вручную, а НЕ - скриптом. Ожидаете ли вы его запустить, когда лист отредактирован вручную или сценарием? – HDCerberus

+0

Спасибо за ответ. Как уже упоминалось, строка корректно перемещается из листа «Запросы» на «Принятый лист» после выбора значения из выпадающего меню. Странно, если я прокомментирую блок кода календаря и снова включу строку Browser.msgbox, я получаю всплывающее окно со значениями, которые передаются правильно. По какой-либо причине, независимо от того, какой код я использую для создания события календаря, он не создает событие. Я даже скопировал и вставил код шаблона календаря Google при запуске нового файла сценария приложений. Ничего не работает. Если мы запускаем функцию вручную в редакторе, она работает. weird – Kayhan

+0

Мы хотим, чтобы код в конечном итоге работал, используя приведенный выше скрипт. Мы хотим, чтобы он был максимально автоматическим. Мы не хотим заходить в редактор сценариев и запускать функцию вручную. Запуск функции вручную также приведет к созданию дубликатов. Теоретически, если код работает только при выборе из выпадающего списка, он должен только подбирать самую последнюю строку и создавать событие без дубликатов. – Kayhan

ответ

1

Простой onEdit() триггер не может делать ничего, что требует авторизации. Неважно, кто владеет документом, в котором находится скрипт; если это простой триггер, то он анонимный.

Вместо этого используйте installable trigger. (Вы можете просто переименовать свою функцию, а затем выполните инструкции в Managing Triggers Manually, чтобы настроить ее.)

+0

Mogsdad, спасибо за ответ. Я просто «запрограммировал триггер» в Google, и в поиске ничего не появилось. Как мы делаем то, что вы предлагаете? К сожалению, мы новичок в программировании скриптов приложений. Thanks – Kayhan

+0

Mogsdad. Вопрос. Какую функцию мне следует переименовать? Я бы скорее попытался сделать триггер программно, но я ничего не работаю. Я очень расстраиваюсь, поскольку мы были на этом почти две недели. Я пробовал это, и он не работал 'function createSpreadsheetEditTrigger() { var ss = SpreadsheetApp.getActiveSpreadsheet(). GetSheetByName (" Accepted "); ScriptApp.newTrigger ('addEvent'). ForSpreadsheet (ss) .onEdit(). Create(); } ' – Kayhan

Смежные вопросы