2017-07-20 15 views
0

我試圖做一個函數來設置一些電子表格的單元格從用戶通過提示設置的數據。如何查看一個範圍,並在單元格中設置一個值,如果有巧合

有一些部件工作良好,一些問題

要投入方面,我們有一個電子表格中的「日曆」,如下所示:在A每一個細胞:範圍是學年的日子,從A1的9月1日開始,9月2日的A2開始,等等。在B列中,我們現在有假期,假期和其他。在一個學年裏有很多「穩定」的日子,比如聖誕節:每年都是同一天和每月(只是變化的一年)。除此之外,每一所學校(幾乎在西班牙)都會選擇休息一段時間。

首先,我們設置函數,輸入範圍(A列進行比較)和輸出範圍(B columne,我們要寫新內容的地方)。 (VaR的作爲所給函數的參數,但在這裏設置用於測試)

function setSpecialHolidays() { 
    var year = 2017; 

我不得不做出一個parseInt函數這個數據,因爲當作爲參數給出檢測爲一個字符串,並不能很好地工作。但現在沒關係。

var yearNumber = parseInt(year); 
    var sheet = SpreadsheetApp.getActive().getSheetByName("Calendar"+year); 
    var inputRange = sheet.getRange('A1:A'+sheet.getLastRow()).getValues(); 
    var outputRange = sheet.getRange('B1:B'+sheet.getLastRow()); 

這裏開始一個循環,我們可以輸入不同的日子。我每天都在提示腳本有將其設置在相應的日期和A柱

的我設置了內容的單元格設置ButtonSet的循環,因爲我需要它來啓動而在此之前,因爲它將一直工作,直到用戶點擊「否」按鈕。

var specialHoliday = ui.alert('Click «Yes» to set a special holidays', ui.ButtonSet.YES_NO); 
    while (specialHoliday == ui.Button.YES) { 
    var dayPointer = ui.prompt('Please enter the special holiday date (DD/MM)'); 
    var specialHolidayDate = dayPointer.getResponseText(); 
    var specialHolidayDateParts = specialHolidayDate.split("/"); 
    var date = new Date(); 
    date.setMonth(specialHolidayDateParts[1] - 1, specialHolidayDateParts[0]); 
    date.setHours(0, 0, 0, 0); 

隨着學年comprend兩個不同的自然年,使可能日期比較,我們需要確保,如果該月份是九月至十二月是當年,但如果一個月從1月到7月左右是*當前年份+ 1「,這是第二年,因爲我這樣做是有條件的,這也很好,我做了一些測試,並且做了一些測試,並且是保證並及時發現當年或下一年。

if (specialHolidayDateParts[1] <= 8) { 
     date.setYear(yearNumber + 1); 
    } else if (specialHolidayDateParts[1] > 8) { 
     date.setYear(yearNumber); 
    } 

這裏是不工作。一旦我們設置了正確的輸入日期,我們就可以將其與inputRange中的所有值進行比較。然後,看每個A列單元格,並在時發現outputRange中找到一個重合的字符串。

我認爲可能有更好的解決方案來解決這個問題,也許不會產生循環,但是這是我之前在此腳本的其他功能中所遵循的過程,現在已經很好了。這種特定的日期設置爲我們的程序的最後一步(現在),但我

for (var i = 0; i < inputRange.length; i++) { 
     var dateCompare = new Date(inputRange[i][0]); 
     if (dateCompare == date) { 
     outputRange[i][0].setValue("Holiday: special holiday"); 
     } 
    } 

最後,如果用戶想要設置的另一天,ButtonSet允許它。當用戶完成單擊「否」而不是「是」,一切都停止。這也是工作。

var specialHoliday = ui.alert('Do you want to set a new special holiday?', ui.ButtonSet.YES_NO); 
    } 

嗯,在此先感謝您的幫助。

+0

它究竟不起作用?這聽起來像它的作品,它只是效率低下,你只是想優化它? –

+0

@RobinGertenbach,腳本不得不設置輸出數據。我認爲陣列有問題,但我不知道如何確保它。 – estemon

+0

您正在比較日期對象作爲設置值的測試。如果你想要日期/時間精確匹配,甚至毫秒,那麼你應該比較兩個日期的毫秒數。如果你只想匹配一年中的某一天,那麼你應該得到每個日期的年份和日期並進行比較。如果你想要一個精確的匹配,那麼你應該在兩個日期對象上使用'now()',然後比較毫秒和毫秒。 –

回答

1

(發佈代表OP)的

我做了一些嘗試,終於我找到了正確的方法做我想做的,在小區中設置的值有我從用戶輸入的日期相比日期的單元格旁邊。有語句中的錯誤:

  • 在一個範圍內,我不能setValues方法(但我是想......)
  • 需要使用.getTime()方法比較上日期值

這裏是(我想!)糾正代碼爲for循環:

for (var i = 0; i < inputRange.length; i++) { 
     var dateCompare = new Date(inputRange[i][0]); 
     if (dateCompare.getTime() == date.getTime()) { 
     outputRange[i][0] = "Holiday: special holiday"; 
     } 
    } 

我終於在outputRange理解這個問題:作爲一個範圍,我不能setValues方法,因爲不是一個單元格,然後,我已經爲是賦值。什麼我不知道得到的是爲什麼我需要.getTime()每比較值之後。但它的作品!

相關問題