2016-04-12 43 views
2

Şu anda, Komut Dosyası Düzenleyicisi'ni kullanarak, geçerli tarih ile birlikte, 2. satırdaki hücreye açık bir Google Sheet belgesi ayarlamaya çalışıyorum. Tarihler kronolojik olarak ve günlük olarak A2: IK2'den düzenlenmiştir. Onlar mm/dd formatlı.Google E-Tablolar elektronik tablosu, günümüzün tarihini içeren tek bir satırda hücreye nasıl açılır?

Benzer bir soru için bu web sitesinde bir yanıt buldum, ancak tarihleri ​​tek bir sütunda listelendi, ancak tarihlerim tek bir satırda. Aşağıdaki kod Marshmallow tarafından buraya gönderildi: https://webapps.stackexchange.com/questions/78927/how-to-make-google-sheet-jump-to-todays-row-when-opened).

hatmi cevabı:

function onOpen() { 
var menu = [{name: "Jump to today's date", functionName: "jumpToDate"}]; 
SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu); 
jumpToDate(); 
} 

function jumpToDate() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getActiveSheet(); 
var range = sheet.getRange("A2:IK2"); //given that it is in row 2 
var values = range.getValues(); 
var day = 24*3600*1000; 
var today = ((new Date().setHours(0,0,0,0))/day); 
var ssdate; 
for (var i=0; i<values.length; i++) { 
    try { 
    ssdate = values[i][0].getTime()/day; 
    } 
    catch(e) { 
    } 
    if (ssdate && Math.floor(ssdate) == today) { 
    sheet.setActiveRange(range.offset(0,i,1,1)); //to offset columns not rows 
    break; 
    }  
} 
} 
ben sütunlara satırlardan aktarılması (aralık sorumluydu düşündüm

"C:: A" dan "A2

function onOpen() { 
var menu = [{name: "Jump to today's date", functionName: "jumpToDate"}]; 
SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu); 
jumpToDate(); 
} 

function jumpToDate() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = ss.getActiveSheet(); 
var range = sheet.getRange("A:A"); 
var values = range.getValues(); 
var day = 24*3600*1000; 
var today = parseInt((new Date().setHours(0,0,0,0))/day); 
var ssdate; 
for (var i=0; i<values.length; i++) { 
    try { 
    ssdate = values[i][0].getTime()/day; 
    } 
    catch(e) { 
    } 
    if (ssdate && Math.floor(ssdate) == today) { 
    sheet.setActiveRange(range.offset(i,0,1,1)); 
    break; 
    }  
} 
} 

ben bunu modifiye: IK2 "ve belirtilen ofsetin değiştirilmesi, ancak kodun herhangi bir etkisi olduğunu görmüyorum. Bugünün tarihine kadar açılsın.

Burada ne eksik? Herhangi bir öneri?

+0

Not 'ki ((new Date() setHours (0,0,0,0))/gün.)' Gerçekten dikkate bütün bu parantez ihtiyacı yoktur: 'new Date() setHours (. 0,0,0,0)/gün '. Ve saat diliminiz GMT değilse, yerel saatlerin sıfır, UTC saatlerini değil, yani 'Math.floor (ssdate) == today' değil, tüm günler değil, sıfır olarak ayarlamanız gerekir. ondalık kesiti kesen), saat diliminiz GMT olmadıkça asla doğru olmaz (bu nedenle ondalık kısım yoktur). – RobG

cevap

1

Aktarımın değişiklik gerektirdiği iki yer daha: values[i][0] yerine values[0][i] ve values.length yerine values[0].length.

RobG'nin açıklamasını ele almak için karşılaştırma mantığını değiştirdim, bölme ve döşemeyi düzensiz eşitsizliklerle değiştirdim: geçerli zaman, elektronik tabloda belirtilen tarihin başlangıcı ile bitişi arasında olmalıdır.

function onOpen() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var range = sheet.getRange("2:2"); // get all 2nd row 
    var values = range.getValues(); 
    var day = 24*3600*1000; 
    var now = Date.now(); 
    var ssdate; 
    for (var i = 0; i < values[0].length; i++) { 
    try { 
     ssdate = values[0][i].getTime(); 
    } 
    catch(e) { 
    } 
    if (ssdate && ssdate <= now && now < ssdate + day) { 
     sheet.setActiveRange(range.offset(0,i,1,1)); 
     break; 
    }  
    } 
} 
+0

Meta, bu mükemmel. Çok teşekkür ederim! Sadeleştirme kesinlikle biraz temizledi. Ve açıklaman, arka görüşte mantıklı. Tekrar teşekkürler! – Colin

+0

Sorun yok; Stack Exchange'de, sorunu çözen bir cevap, solundaki onay işaretine tıklayarak "kabul edilmiş" olarak işaretlenebilir. –