Google apps script 在chrome中的google工作表中,工作表顺序与索引无关

Google apps script 在chrome中的google工作表中,工作表顺序与索引无关,google-apps-script,google-sheets-api,Google Apps Script,Google Sheets Api,电子表格有一个脚本,用于更新选项卡并根据输入的周结束日期对其进行标记。它还会根据一周中选定的最后一天(例如星期六或星期日)重新排列它们。电子表格公式计算日期顺序以及月份的日期和日期。这些将从命名范围读取到脚本中 它可以在我的IOS设备上正常工作,有时也可以在chrome桌面上正常工作。但是(在chrome桌面上)它进入了一种模式,其中一张纸总是错位。在本例中,我使用序列位置(0到6)和返回的图纸索引标记选项卡,因此很明显问题在于对象模型和渲染之间的对齐。正如你在下面的图片中看到的,星期一的工作表

电子表格有一个脚本,用于更新选项卡并根据输入的周结束日期对其进行标记。它还会根据一周中选定的最后一天(例如星期六或星期日)重新排列它们。电子表格公式计算日期顺序以及月份的日期和日期。这些将从命名范围读取到脚本中

它可以在我的IOS设备上正常工作,有时也可以在chrome桌面上正常工作。但是(在chrome桌面上)它进入了一种模式,其中一张纸总是错位。在本例中,我使用序列位置(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
  }
}

我面临着与您完全相同的问题,使用了非常相似的功能脚本。不幸的是,这个问题没有“修复”,这似乎是浏览器的缓存问题。我找到的唯一解决方法是刷新窗口两次,或者关闭并重新打开电子表格,然后选项卡以正确的顺序显示

好的,谢谢。我从来没有想过浏览器缓存。在我问这个问题之前,我花了好几个小时写和重写我的脚本,然后意识到我可能一开始就写对了脚本。是的。。。有人真的坚持用汽油吗?我觉得很痛苦。唯一可取之处是IDE。。。不