2014-11-27 3 views
1

Google 양식을 사용하여 약속을 요청하는 온라인 양식을 만들려고합니다. 이 같은 프로세스가 보일 것입니다 무엇 :Google Apps Script - 캘린더 일정을 만들지 않는 createEvent 함수

  1. 사용자가 양식을 채우고 새로운 들어오는 요청을 우리에게 통보 이메일은 우리의 Gmail로 보내집니다
  2. 자신의 정보를 (이 작품) 제출
  3. (이 작품)
  4. Google 스프레드 시트로 이동합니다. 3 장이 있습니다. 한 장은 이고 요청은입니다. 다른 하나는 수락 됨입니다. 그리고 다른 하나는 거부 ​​됨 (생성되었습니다)
  5. 요청 시트의 마지막 열에 허용 또는 거부 값을 가진 드롭 다운 메뉴가 있습니다. 선택한 항목에 따라 전체 행이 승인 또는 거부 됨으로 적절한 시트로 이동합니다. (위의 5 단계까지 작동)
  6. 행이 수락 됨으로 이동되면 새 일정 관리 이벤트를 만들어야합니다. 이것은 작동하지 않는 부분입니다. 행이 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 라인을 다시 활성화하면 제대로 전달 된 값이있는 팝업 상자가 생기는 것입니다. 어떤 이유로 든 캘린더 일정을 만들 때 어떤 코드를 사용하더라도 이벤트를 만들지 않습니다. 새 Apps Script 파일을 시작할 때 Google의 캘린더 템플릿 코드를 복사하여 붙여 넣기도했습니다. 아무것도 작동하지 않습니다. 편집기에서 수동으로 함수를 실행하면 작동합니다. 이상한 – Kayhan

+0

위의 스크립트를 사용하여 코드가 궁극적으로 작동하기를 바랍니다. 우리는 가능한 한 자동화되기를 원합니다. 우리는 스크립트 편집기에 들어가서 수동으로 함수를 실행하지 않아도됩니다. 함수를 수동으로 실행하면 중복 항목도 생성됩니다. 이론적으로 코드가 드롭 다운에서 선택하는 경우에만 실행되는 경우 마지막 행을 선택하고 중복이없는 이벤트를 생성해야합니다. – Kayhan

답변

1

간단한 onEdit() 트리거는 인증이 필요한 모든 작업을 수행 할 수 없습니다. 스크립트가있는 문서의 소유주는 중요하지 않습니다. 간단한 트리거 인 경우 익명입니다.

대신 installable trigger을 사용하십시오. (단순히 기능 이름을 바꾼 다음 Managing Triggers Manually의 지침을 따라 설정하십시오.)

+0

Mogsdad, 답장을 보내 주셔서 감사합니다. 방금 "프로그래밍 된 방아쇠"를 감지하고 아무 것도 실제로 검색에 나타나지 않았습니다. 우리가 당신이 제안한 것을 어떻게합니까? 죄송합니다. Apps Script를 처음 사용합니다. 감사합니다 – Kayhan

+0

Mogsdad. 문제. 어떤 기능을 바꿔야합니까? 나는 프로그래밍 방식으로 방아쇠를하려고 노력할 것이지만, 나는 아무것도하지 않는 것 같다. 우리가 거의 2 주 동안이 일을 해오면서 저는 매우 좌절하고 있습니다. 나는 이것을 시도했지만 작동하지 않았다. 'function createSpreadsheetEditTrigger() { var ss = SpreadsheetApp.getActiveSpreadsheet(). getSheetByName ("Accepted"); ScriptApp.newTrigger ('addEvent'). forSpreadsheet (ss) .onEdit(). create(); }' – Kayhan