2017-05-04 3 views
1

1つのスプレッドシートにアクセスする大規模なチームがあります。各人には日付の列(列C)のあるタブがあり、各日付に対して受け取った情報を入力します。私は各シートをタブを開くと現在の日付にジャンプしたいと思います。以下のスクリプトは動作しますが、最初のタブ/シートの場合にのみ使用でき、他のすべてのタブで手動で実行する必要があります。一度開いたら、すべてのタブで実行できるように、これを修正するにはどうすればよいですか?複数のタブを持つスプレッドシートの場合、to-to-date-date onOpenに移動する方法

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("C:C"); 
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; 
    }  
} 
} 
+0

この場合「大」とはどういう意味ですか?また、ドメイン内のビジネス/教育用のGoogleアカウントを使用していますか?または通常のGmailアカウントですか? –

答えて

0

現在

にはイベントトリガー選択シートもありません。しかし、それぞれのタブには、一意のリンクがあります。各ユーザーが独自のタブを持っている場合、彼らは個人的なTADへのリンクを保存するかもしれない、とスクリプトが動作するスプレッドシートが開いているときに、理由はこのラインの:

var sheet = ss.getActiveSheet();

+0

イベント*トリガー*選択シートがないと思いますか? –

0

あなたはスクリプトから用紙選択を検出することはできませんが、スプレッドシートでアクティブシートを選択する方法を変更することができます。 サイドバーを使用すると、特に多くのシートがある場合は、通常の選択モードよりも使いやすくなります。

以下のコードは、私がたくさん使っているサイドバーツールの簡略版です。私は不要な項目をすべて削除しました(少なくとも私はそう願っています!)、あなたのコードを統合して現在の日付にジャンプします。

それは私がそれをたくさん使用しますが、私はそれがこの簡単なスクリプトで非常に有用ではありません認めるはるかに大きなスクリプトの一部ですので、それは私がそれを削除するにはあまりにも怠惰だった... jqueryのを使用しています:)

全体のコードはかなり長いですが、理解するのは非常に簡単です。 this public copyのコピーから開始することもできます。

enter image description here

code.gs

function onOpen() { 
    SpreadsheetApp.getUi() 
    .createMenu("Authorize") 
    .addItem('Authorize script', 'authorize') 
    .addToUi(); 
    showSidebar(); 
} 

function authorize(){ 
    showSidebar(); 
} 

function showSidebar() { 
    var ui = HtmlService.createTemplateFromFile('Sidebar') 
     .evaluate() 
     .setSandboxMode(HtmlService.SandboxMode.IFRAME) 
     .setTitle('Page selection'); 
    SpreadsheetApp.getUi().showSidebar(ui); 
} 


function createList(){ 
    var ssProfs_envois = SpreadsheetApp.getActiveSpreadsheet(); 
    var list = []; 
    var sh, sheetName; 
    for(var s=0;s<ssProfs_envois.getNumSheets();s++){ 
    sh = ssProfs_envois.getSheets()[s]; 
    sheetName = sh.getName(); 
    list.push(sheetName); 
    } 
    var message = ''; 
    var color; 
    message+= '<table style="border-collapse:collapse;font-family:arial,sans;font-size:9pt;" border = 1 >'; 
    message+='<tr valign="top" cellpadding=5>' 
    for(var n=0;n<list.length;n++){ 
     color="#000" 
    message+='<tr><td align="center">&nbsp'+(n+1)+'&nbsp</td><td>'+ 
     '<input type="button" id="button'+n+'" value="'+list[n]+'" style="color:'+color+'; width:200px;font-size:10pt;white-space:normal;" onclick="selectSheet(\''+n+'\')"/></td></tr>'; 
    } 
    message+='</table>'; 
    return message; 
} 

function showSheetGS(sheetNumber){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheets()[sheetNumber].activate(); 
    jumpToDate(sheet); 
} 

function jumpToDate(sheet) { 
    var range = sheet.getRange("A1: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; 
    }  
    } 
} 

Sidebar.html

<?!= HtmlService.createHtmlOutputFromFile('Stylesheet').getContent(); ?> 

<!-- Below is the HTML code that defines the sidebar element structure. --> 
<div class="sidebar branding-below"> 
<!-- The div-table class is used to make a group of divs behave like a table. --> 
<h3>Available tabs,<br><span style="color:#070"> Green typeface = </span>sheet already selected</h3> 
    <div id="sidebarList"> 
    <br><br><br>...wait a moment,<br>list is being created. 
    <p>If nothing happens then please authorize the script using the menu.</p> 
    </div> 

<!-- Enter sidebar bottom-branding below. --> 
    <div class="sidebar bottom"> 
    <img alt="Add-on logo" class="logo" width="25" 
     src="http://insas.cluster006.ovh.net/serge/apps-script_2x.png"> 
    <span class="gray branding-text">Sheet Select tool<br>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp© SG 2017</span> 
<?!= HtmlService.createHtmlOutputFromFile('SidebarJavaScript').getContent(); ?> 

SidebarJavaScript.html

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
<script> 
    /** 
    * Run initializations on sidebar load. 
    */ 
populateEncodeLocal(); 

function populateEncodeLocal(){ 
    //console.log('populateEncode'); 
    google.script.run.withSuccessHandler(populateList).createList(); 
} 

function selectSheet(sheetNumber){ 
    console.log(sheetNumber); 
    google.script.run.withSuccessHandler(showSheet(sheetNumber)).showSheetGS(sheetNumber); 
} 
function showSheet(n){ 
    console.log("showSheet"+n); 
    $('#button'+n).css('font-size','14pt').css('color','#070'); 
} 

function populateList(data){ 
    //console.log(data); 
    $('#sidebarList').html(data); 
} 
</script> 

Stylesheet.html

<!-- This CSS package applies Google styling; it should always be included. --> 
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css"> 
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> 
<style> 

html, body { 
    max-width: 100%; 
    overflow-x: hidden; 
} 

#sidebarList { 
    width:270px; 
    height:600px; 
    overflow:auto; 
    } 

input[type="button"] { 
    height: 23px; 
    width: 270px; 
    padding-left: 8px; 
    line-height: 24px; 
} 

label { 
    font-weight: bold; 
} 

.branding-below { 
    bottom: 3px; 
    top: 0px; 
    padding-left:0px; 
} 

.branding-text { 
    left: 7px; 
    position: relative; 
    top: 3px; 
} 

.logo { 
    vertical-align: middle; 
} 

.width-100 { 
    width: 100%; 
    box-sizing: border-box; 
    -webkit-box-sizing : border-box;‌ 
    -moz-box-sizing : border-box; 
} 

#sidebar-value-block, 
#dialog-elements { 
    background-color: #eee; 
    border-color: #eee; 
    border-width: 5px; 
    border-style: solid; 
} 

#sidebar-button-bar, 
#dialog-button-bar { 
    margin-bottom: 10px; 
} 

.div-table{ 
    display:table; 
    width:280px; 
    height:500px; 
    background-color:#eee; 
    border:1px solid #666666;*/ 
    border-spacing:2px; 
    font-size:8,5pt; 
} 
.div-table-row{ 
    display:table-row; 
    width:auto; 
    clear:both; 
} 
.div-table-td, .div-table-th { 
    display:table-cell;   
    width:auto; 
    background-color:rgb(230, 230, 230); 
    padding-left:4px; 
    padding-right:4px; 
} 
.div-table-th { 
    /*float:left;*/ 
    font-weight: bold; 
} 
.div-table-td { 
    /*float:right;*/ 
} 
div.ui-datepicker{ 
padding:0px; 
font-size:90%; 
width: 250px; 
heigth: 90px; 
    } 

th { 
    border-bottom: 0px solid #acacac; 
    font-weight: normal; 
    padding: 1px 1px 0; 
    text-align: left; 
} 

td { 
    border-bottom: 0px solid #ebebeb; 
    padding: 1px 0; 
} 


} 
</style> 
0

これは可能ですが遅いです。

考えられるのは、すべてのシートに対してjumpToDateをトリガーonOpen()を使用して1つずつ呼び出すことです。ただし、Googleシートは、1枚のシートを開いたときに同時にすべてのシートをレンダリングすることはありませんが、開いたシートのみをレンダリングすることはありません。 「人気がない」シートタブをクリックすると、ブラウザがレンダリングする必要があります。テストでは、単純なシートで500ミリ秒かかりました。大きなスプレッドシートでは時間がかかることがあります。ここで

、私はあなたの質問に答えるために、あなたのコードを適応する方法である:

function jumpToDate() { 
 
    /* optional:*/ /*var ui = SpreadsheetApp.getUi(); 
 
    var response = ui.alert('Today', 'To scroll to today, please click yes.', ui.ButtonSet.YES_NO); 
 
    if(response == "NO"){return}; */ 
 
    
 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
 
    var sheet = ss.getSheets(); // this now gets all the sheets 
 
    var numSheets = ss.getNumSheets(); // gets number of sheets 
 
    
 
    var day = 24*3600*1000; 
 
    var today = parseInt((new Date().setHours(0,0,0,0))/day); 
 
    var range; 
 
    var values; 
 
    var ssdate; 
 
    
 
    for (h = 0; h < numSheets; h++) { 
 
    
 
    range = sheet[h].getRange("C:C"); // note the [h] 
 
    ss.setActiveSheet(sheet[h]); 
 
    Utilities.sleep(500); // without this line, it runs much faster but some sheets don't load. 
 
          // I recommend that you play around and increase/decrease the 500 number 
 
        
 
    values = range.getValues(); 
 
    
 
    for (var i=0; i<values.length; i++) { 
 
     try { 
 
     ssdate = values[i][0].getTime()/day; 
 
     } 
 
     catch(e) { 
 
     } 
 
     if (ssdate && Math.floor(ssdate) == today) { 
 
     sheet[h].setActiveRange(range.offset(i,0,1,1)); // note the [h] 
 
     break; 
 
     }  
 
    } 
 
    } 
 
}

それは、このオプションは、ニーズのために遅すぎるという可能性がありますので、私たちは問題にアプローチすることをお勧めします異なっている。毎日編集しない行をすべて表示する必要がありますか?頻繁に読んでいますか?そうでなければ、あまり使わない行を隠すことができます。これはhideRows(rowIndex, numRows)メソッドを使用して行うことができます。午前3時にhideOldを(実行するトリガを追加

  • ) - (10日今日)の前に行を非表示にする

  • カスタマイズhideOld(今日前に、すべての行を隠す機能hideOldを作成
    1. ())毎日
  • +0

    私はあなたの最初の解決策を試しましたが、遅すぎると感じました。私はあなたの2番目の提案、この場合の要件を満たしている場合は良いアイデアが好きです! –

    関連する問題