2012-11-01 37 views
1

我已經創建了一個電子表格,可以從Google Spreadsheet名單中創建Google日曆活動。澳大利亞與美國的日期問題(我想!)

我在過去的一個月裏成功地在我的團隊中使用了這個功能,現在我遇到了所有可怕的Date類型問題。

據我的理解,電子表格時區將被用於確定使用.getValue()等函數時的日期。現在,當我嘗試發送11月名冊的日曆事件時,它可以正常工作,直到2012年11月12日至2012年11月13日的更改。

腳本將獲得日期12/11/2012(var type:日期),並將用它來創建事件。當它試圖獲得下一個日期時,它只會返回一個空白字符串。然後,Utilities.formatDate()函數將引發一個錯誤,指出它無法格式化一個String變量。

下圖顯示了11月10日的代碼和調試信息。這是13日應該看起來如何,如果它工作正常。 enter image description here

下圖顯示了11月13日的代碼,錯誤和調試信息。你可以看到getDate是一個空白字符串,而在10日它是一個日期。 (getDate變量之後的任何變量信息從最後一次迭代中遺留下來) enter image description here

我一直在絞盡腦汁地解釋這一點。 .getValue()引用的單元格都包含有效的澳大利亞日期。它已經在10月份全部工作,並且只是當日期晚於13/11/2012時的問題(我也使用17/11/2012進行了測試,結果相同)。

這就是我的想法:.getValue返回13/11/2012,但是這個腳本將這個視爲美國約會。因此它決定不存在第13個月並且回落到一個空的字符串。這個解釋並沒有解釋十月事件的正確用法。腳本處理13/10/2012就好了。

如果您有任何建議,請提供他們,我在我的智慧結束!

編輯:添加代碼爲每個請求:

function sendInvites() { 
    // Gather Prelim Information 
    var splash = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Splash"); 
    var nameRange = splash.getRange("A6:B26"); // Need to change this to be the full staff list in Splash 

// var inviteSheet = Browser.inputBox("Sheet to send invites from (Number)", Browser.Buttons.OK_CANCEL) 
    var days = SpreadsheetApp.getActiveSpreadsheet().getSheets()[2]; 
    var dayRange; 

    //Initiate iteration through Names, according to the Splash sheet 
    for(nameRow=nameRange.getRow(); nameRow<=26; nameRow++){ //Change to Corresponding iterate 
    // Gather Name and Email information for the each person 
    var col = nameRange.getColumn(); 
    var row = nameRow; 
    var name = splash.getRange(row, col).getValue(); 
    var email = splash.getRange(row, col+1).getValue(); 
    var eventChoice = splash.getRange(row, col+2).getValue(); 

    //Proceed if all information and permission exists 
    if(name != "" && email != "" && eventChoice == "Yes"){ 
     var cal = CalendarApp.getCalendarById(email); 

     //Initiate iteration through Days, according to the Roster 
     for(i=0; i<=6; i++){ 
     //Specify Day Ranges 
     switch(i){ 
      case 0: //Saturday 
      dayRange = days.getRange("A1:O6"); break; 
      case 1: //Sunday 
      dayRange = days.getRange("A10:O15"); break; 
      case 2: //Monday 
      dayRange = days.getRange("A19:O41"); break; 
      case 3: //Tuesday 
      dayRange = days.getRange("A45:O67"); break; 
      case 4: //Wednesday 
      dayRange = days.getRange("A71:O93"); break; 
      case 5: //Thursday 
      dayRange = days.getRange("A97:O119"); break; 
      case 6: //Friday 
      dayRange = days.getRange("A123:O145"); break; 
     } 

     //Find Name in dayRange 
     for(dayRow=dayRange.getRow(); dayRow<=dayRange.getLastRow(); dayRow++){ 
      var searchCol = dayRange.getColumn(); 
      var searchRow = dayRow;   
      var searchName = days.getRange(searchRow, searchCol).getValue(); 

      if (name==searchName){ 
      // Gather and format Date and Time information for invitation 
      var eventName = "Library & IT Help"; 
      var getDate = dayRange.getValue(); 

      var date = Utilities.formatDate(getDate, "GMT+1000", "EEE MMM dd yyyy"); 
      var startCell = days.getRange(searchRow, searchCol+1).getValue(); 
      var endCell = days.getRange(searchRow, searchCol+2).getValue(); 

      if (startCell != ""){ 
       var startTime = date + " " + Utilities.formatDate(startCell, "GMT+1000", "HH:mm:ss"); 
       var endTime = date + " " + Utilities.formatDate(endCell, "GMT+1000", "HH:mm:ss"); 
       //Create a calendar event with the details above 
       cal.createEvent(eventName, new Date(startTime), new Date(endTime)); 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

你能發佈你的整個代碼(或至少到第42行)嗎?我並不十分清楚'dayRange'變量 - 它看起來是一個2-D範圍,但在第52行中,您使用的是'dayRange.getValue()'。不過,我可能錯過了一些東西。 – AdamL

+0

是的,你是對的。這是一個2D範圍,其尺寸在開關語句中指定。 .getValue()將獲得左上角單元格的值,即該範圍的日期。 – makio

+0

只是爲了確保這不是一個問題 - 腳本需要多長時間?沒有接近超時限制? (我認爲5分鐘)在那裏有很多循環,我知道這可能不是錯誤的原因,但只是想確保這不是問題。 – AdamL

回答

1

您需要確保腳本本身使用您所使用的語言環境。您可以在腳本編輯器>文件>屬性(從內存)中設置它。

+0

哇,我不知道那是否存在。我剛剛確認時區是正確的(格林威治標準時間+10:00東部時間 - 布里斯班)。這似乎不是原因 – makio

相關問題