Блокировка вкладок Google Sheet на месте - PullRequest
0 голосов
/ 15 января 2019

Можно ли предоставить пользователям доступ для редактирования на листе Google, но запретить им изменять порядок вкладок листа внизу?

привет

1 Ответ

0 голосов
/ 15 января 2019

Вы не можете предотвратить изменение порядка листов редакторами, но вы, безусловно, можете переупорядочить их обратно. Если посмотреть на доступные события электронной таблицы , можно подумать, что событие «при изменении» сработает для переупорядоченных листов. По состоянию на январь 2019 года это не так. Однако вы все равно можете связать несколько событий (т. Е. «Изменить», «изменить» и «открыть») с помощью установленного триггера и обеспечить желаемое упорядочение листов с помощью Spreadsheet Service или расширенный сервис Sheets, то есть API REST Sheets .

Наиболее эффективное переупорядочение выполняется с помощью API Sheets без изменения активных листов пользователей, но в нем есть ошибка обновления пользовательского интерфейса, если вы переупорядочиваете более одного листа на вызов API (переупорядочение происходит на конце Google и в браузере Пользовательский интерфейс (ы) не обновляются). Это переупорядочение может быть выполнено в среднем ~ 100-230 мс на вызов API.

Вот пример кода, который не является наиболее эффективным API, чтобы его было проще понять и реализовать:

function enforceOrder(eventObject) {
  const requiredSheetOrder = ['name of first sheet', 'name of second sheet' ....];
  // Get the workbook ID for the Sheets REST API.
  const id = (eventObject ? eventObject.source : SpreadsheetApp.getActive()).getId();
  // You must enable the advanced service prior to using this code.
  // https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services
  const state = Sheets.Spreadsheets.get(id, {fields: "sheets/properties(title,sheetId,index)"});

  // Collect the requests to be made.
  const batchRequests = [];
  requiredSheetOrder.forEach(function (title, i) {
    var rq = {
      fields: "index",
      properties: { index: i }
    };
    var matched = state.sheets.filter(function (s) { return s.properties.title === title; })[0];
    if (matched)
    {
      rq.properties.sheetId = matched.properties.sheetId;
      // If any preceding sheets are being reordered, or this sheet
      // is not in the right position, we must set this sheet's index.
      if (batchRequests.length || i !== matched.properties.index)
        batchRequests.push({ updateSheetProperties: rq });
    }
    else
      console.warn("No sheet found with required name '" + title + "'");
  });

  // Send updates, if there were any to send.
  if (batchRequests.length)
  {
    // Sheets.Spreadsheets.batchUpdate({ requests: batchRequests }, id);
    // The above wholly-batch line induces the mentioned UI bug.
    // The below one-by-one update does not:
    batchRequests.forEach(function (r) {
      Sheets.Spreadsheets.batchUpdate({ requests: [r] }, id);
    });
    console.log("Reordered " + batchRequests.length + " sheets");
  }
  else
    console.log({message: "No-op", desired: requiredSheetOrder, current: state.sheets });
}

Эффективность API может быть улучшена путем сравнения текущего состояния листа и желаемого конечного состояния и вычисления минимального количества спецификаций индекса для исправления упорядочения листов (то есть с учетом того, что размещение листа по индексу i перемещается лист в настоящее время в индексе i до i+1).

PS: при работе со службой электронных таблиц индекс позиции / электронной таблицы основан на 1. При работе с расширенным сервисом / REST API индекс позиции листа всегда равен 0-основанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...