This В таблице есть сценарий, который обновляет вкладки и маркирует их в ответ на введенную дату окончания недели. Он также перестраивает их в зависимости от выбранного последнего дня недели (например, в субботу или воскресенье). Формулы электронных таблиц вычисляют порядок дней и день и день месячной маркировки. Они считываются в сценарий из именованных диапазонов.Лист без учета индекса в листах google в хроме
Он отлично работает на моих устройствах IOS и иногда работает нормально в хромированном рабочем столе. Но (в хромированном рабочем столе) он попадает в режим, когда один лист всегда находится вне позиции. В этом примере я отмечаю вкладки с позицией последовательности (от 0 до 6) и индексом возвращенного листа, поэтому ясно, что проблема заключается в выравнивании между объектной моделью и рендерингом. Как вы можете видеть на следующем рисунке, лист в понедельник находится вне позиции, если я снова изменил день окончания рабочего дня, он снова окажется вне позиции.
Как можно заставить 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
}
}
Хорошо, спасибо. Я никогда не думал о кеше браузера. –
Я часами и часами писал и переписывал свой сценарий, прежде чем задал вопрос [здесь] (http://stackoverflow.com/questions/41237026/script-to-rename-reorder-sheets-based-on-table), а затем понял, что я, вероятно, правильно написал сценарий в первую очередь. –
Yeh ... Неужели кто-то на самом деле упорствует с ГАЗОМ? Мне это кажется несчастью. Единственной спасительной изюминкой является IDE ... Нет. –