2017-02-06 17 views
0

Thisスプレッドシートには、タブを更新し、入力された週の終了日に応じてラベルを付けるスクリプトがあります。また、選択した最終曜日(土曜日や日曜日など)に基づいて並べ替えます。スプレッドシートの式は、月と日の順序を計算します。これらは名前付き範囲からスクリプトに読み込まれます。シートオーダーはクロムのGoogleシートのインデックスを尊重しません

IOSデバイスで正常に動作し、クロムデスクトップで正常に動作することがあります。しかし、(クロムのデスクトップでは)1枚のシートが常に正しい位置にないモードになります。この例では、タブにシーケンス位置(0〜6)と返されたシートインデックスを付けてラベルを付けるので、問題はオブジェクトモデルとレンダリングの位置合わせであることは明らかです。次の写真からわかるように、月曜日のシートは位置がずれています。私が週末の日をもう一度変更すると、もう一度その位置に戻ってしまいます。

enter image description here

どのように私はシートのインデックスを尊重するために、Googleのシートを強制することができますか? 私はフラッシュしましたが、喜びはありませんでした。私がそれを確実に整列させることができる唯一の方法は、シートを閉じて再度開くことです。

function onEdit(e) { 
    var source = e.range; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 

    if(!qualifiedSource(e.range, ["selectedDate", "lastDayOfWeek"].map(function(n) { 
    return ss.getRangeByName(n); 
    }))) return; 

    var fmtedNames = WeekEndingDate2(); 

    // add indexing to the sheet names 
    ss 
    .getSheets() 
    .filter(function(sht) { return fmtedNames.indexOf(sht.getName()) != -1 }) 
    .forEach(function (s, i) { s.setName(s.getName() + ":" + i + ":" + s.getIndex()); }); 
} 

function qualifiedSource (source /*range*/, target /*range | range[]*/) { 
    if(!isArray(target)) target = [target]; 
    return target.some(function(t) { 
    return source.getSheet().getName() == t.getSheet().getName() && source.getA1Notation() == t.getA1Notation(); 
    }); 
} 

function WeekEndingDate2() { 
    var _wb = SpreadsheetApp.getActiveSpreadsheet(); 
    var _days = _wb.getRangeByName("daysOfWeek"); 
    var _daysFmt = _wb.getRangeByName("daysOfWeekFmt"); 

    return (function _update() { 
    var daySheets = SheetsCollection(); 
    var days = _days.getValues()[0]; 
    var daysFmt = _daysFmt.getValues()[0]; 

    daySheets 
    .Add(days.map(namesToSheets)) 
    .Sort(daysFmt); 

    return daysFmt; 

    function namesToSheets(d, i) { 
     var allSheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
     var targetSheet; 
     allSheets.some(function(sht) { 
     return targetSheet = sht.getName().indexOf(d) === 0 ? sht : null; 
     }); 

     Logger.log(Utilities.formatString("%s\t%s", d, targetSheet.getName())); 

     if (targetSheet == null) 
     throw new Error("Error: Missing sheet for " + d); 

     return targetSheet.setName(daysFmt[i]); 
    } 
    })(); 
} 

function SheetsCollection() { 
    var _sheets = {}; // hash of WrappedSheets 
    var _maxIndex = 0; 

    function _hash (n) { 
    return n.replace(" ", "_"); 
    } 

    function _addItem (s /*worksheet*/) { 
    _sheets[_hash(s.getName())] = WrappedSheet(s); 
    _maxIndex = Math.max(_maxIndex, s.getIndex()) 
    } 

    function _add (s /*worksheet | worksheet[]*/) { 
    if(Array.isArray(s)) 
     s.forEach(_addItem); 
    else 
     _addItem(s); 
    return this; 
    } 

    function _sort (sortOrder /*range | string[]*/, delay /* int milliseconds */) { 
    var sortedNames = sortOrder.getValues ? sortOrder.getValues()[0] : sortOrder; 
    var namesLength = sortedNames.length; 
    var i, sht; 

    for each (var name in sortedNames) { 
     Logger.log(name); 
     _sheets[_hash(name)].MoveTo(_maxIndex); 
     if(delay) Utilities.sleep(delay); 
    } 
    return this; 
    } 

    return { 
    Add: _add, 
    Sort: _sort 
    } 

} 

function WrappedSheet(sheet /*string || sheet*/) { 
    var _wb = SpreadsheetApp.getActive(); 
    var _sheets = _wb.getSheets(); 
    var _shtName = typeof sheet == "string" ? sheet : sheet.getName(); 

    function _moveTo (to /*integer*/) { 
    var insertAt = to; 
    var actSht = _wb.getActiveSheet(); 
    var maxAttempts = 10; 
    var attempt = 1; 

    var before = this.Sheet.getIndex(); 
    Logger.log(listSheets("")); 

    _wb.setActiveSheet(this.Sheet); 
    _wb.moveActiveSheet(insertAt); 
    _wb.setActiveSheet(actSht); 

    Logger.log("%s -> %s after %s", this.Name, this.Sheet.getIndex(), attempt -1); 

    Logger.log(listSheets("")); 

    } 

    return { 
    MoveTo: _moveTo, 
    get Sheet() { return _wb.getSheetByName(_shtName); }, 
    get Position() { return _wb.getSheetByName(_shtName).getIndex(); }, 
    Name: _shtName 
    } 
} 

答えて

1

非常によく似た機能のスクリプトとまったく同じ問題に直面しました。残念ながら、この問題の「修正」はありません。ブラウザのキャッシングの問題のようです。私が見つけたその周りの唯一の方法は、ウィンドウを2回リフレッシュするか、スプレッドシートを閉じて再オープンして、タブが正しい順序で表示されるようにすることでした。

+0

よろしくお願いいたします。私はブラウザのキャッシュについては決して考えなかった。 –

+0

私は[ここ](http://stackoverflow.com/questions/41237026/script-to-rename-reorder-sheets-based-on-table)の質問をする前に何時間も時間をかけてスクリプトを書いて書き直しました。私はおそらく最初に正しくスクリプトを書いていたことに気づいた。 –

+0

ええと...誰も実際にガスで辛抱強くしていますか?それは私にとっては悲惨さのように感じます。唯一の恩恵は、IDEです... Not。 –

関連する問題