Ссылка на конкретный лист в электронной таблице Google

47

У меня сложная электронная таблица Google с множеством листов и оглавлением. Есть ли способ создать ссылку на имена листов, чтобы одним щелчком мыши можно было перейти непосредственно к листу? То есть: нажав на ячейку «лист5» переключается на лист5?

JBWhitmore
источник
1
Теперь в электронных таблицах Google есть такая опция - вы можете выбрать Вставить -> ссылка и выбрать Таблицы в этой электронной таблице. К сожалению, у меня нет репутации, необходимой для публикации этого ответа.
Борис Странджев

Ответы:

59

Когда вы переключаетесь на другой лист в Google Spreadsheets, обратите внимание на URL в адресной строке вашего браузера. В конце URL вы должны увидеть что-то вроде:

#gid=0

Этот номер изменяется при переключении листов и указывает, какой лист отображать. Скопируйте весь URL и создайте гиперссылку на него по следующей формуле:

=hyperlink("https://docs.google.com/spreadsheet/ccc?key=0AsaQpHJE_LShcDJ0dWNudHFZWVJqS1dvb3FLWkVrS0E#gid=0", "LINK TEXT")

Со скриптом

Я много думал об этом вопросе с тех пор, как впервые написал этот ответ, и я нашел решение, включающее сценарий.

Открыв таблицу, откройте меню « Сервис» , затем « Редактор сценариев ...» . Вставьте весь этот код в редактор:

function onOpen(event) {
  var ss = event.source;
  var menuEntries = [];
  menuEntries.push({name: "Go to sheet...", functionName: "showGoToSheet"});
  ss.addMenu("Tasks", menuEntries);
}

function showGoToSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var allsheets = ss.getSheets();
  var app = UiApp.createApplication();
  app.setTitle("Go to sheet...").setWidth(800).setHeight(600);
  var table = app.createFlexTable();
  table.setCellPadding(5).setCellSpacing(0);
  var goToSheetClick = app.createServerHandler('handleGoToSheetClick');
  var widgets = [];
  for (var i = 0; i < allsheets.length; i++) {
    var sheet_name = allsheets[i].getName();
    widgets[i] = app.createHTML(sheet_name).setId(sheet_name).addClickHandler(goToSheetClick);
    table.setWidget(i, 1, widgets[i])
  }
  var panel = app.createSimplePanel();
  panel.add(table);
  app.add(panel);
  ss.show(app);
}

function handleGoToSheetClick(e) {
  var sheet_name = e.parameter.source;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheet_name);
  sheet.activate();
  var app = UiApp.getActiveApplication();
  app.close();
  return app;
}

Сохраните сценарий, затем обновите электронную таблицу. Через секунду или две после Справки появится новое меню Задачи . В этом меню есть один пункт: Перейти на лист ...

Задачи> Перейти к листу ...

Этот пункт меню откроет панель со списком имен всех листов в текущей электронной таблице. Это не похоже на это, но если вы нажмете на одно из имен листов, этот лист выйдет вперед.


Как ответ на другой вопрос, этот скрипт был улучшен, чтобы включить прокручиваемый вид и кнопки.

Уильям Джексон
источник
Да, я думаю, что это единственное жизнеспособное решение на данный момент. К сожалению, я не нашел способа перевести имя «Лист5» на другое gid=7.
Саймон Ист
Я не уверен, что именно вы имеете в виду. Листы нумеруются по порядку слева, начиная с 0. Таким образом, если лист с именем «Лист5» находится в gid=7, это должен быть восьмой лист слева.
Уильям Джексон
1
Я имею в виду, что вы не можете программно узнать, что такое gidSheet5, только вручную. Если позиция меняется, она gidменяется, и вы больше не можете надежно на нее ссылаться.
Саймон Ист
Если вы нашли способ ссылки по имени, пожалуйста, напишите об этом!
Джо Касадонте
1
Лучший вариант доступен здесь: stackoverflow.com/a/18518779/1814867
Mandar Pandit
7

Из моего опыта лучший способ сделать это - привязать функцию к кнопке / изображению. Единственным недостатком является то, что вы не можете передавать параметры вместе со сценарием, назначенным кнопке. В связи с этим вам нужно будет создать функцию, специфичную для каждой навигации, но они могут вызываться в одном файле сценария.

шаги:

Создайте изображение («Вставка» -> «Изображение») и настройте его по своему вкусу.

Создайте пользовательскую функцию со следующим:

function showSheetByName(Name) {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getSheetByName(Name);
   SpreadsheetApp.setActiveSheet(sheet);
}

а затем функция, специфичная для вашей кнопки

function showSheet5() {
   showSheetByName("Sheet5");
}

Наконец, назначьте эту функцию вашей кнопке

Assign Script...
showSheet5

Теперь вы сможете нажать на кнопку и перейти к «Листу 5». Это также можно изменить, чтобы перейти к определенной области листа.

LoganDell
источник
Вместо добавления функции, специфичной для каждой кнопки, вы можете жестко закодировать ее, чтобы перейти к листу, названному в «текущей ячейке», например, измените 2-ю строку на чтение var sheet = ss.getSheetByName(ss.getActiveCell().getValue()); - затем вы можете поместить «кнопку» в фиксированное место на экране. и пометить его «Перейти к листу в текущей ячейке» и назначить его «showSheetByName» (которому теперь не нужен параметр). Чтобы использовать, просто выделите ячейку с именем листа (например, Sheet5) и нажмите кнопку. Это немного косвенно, но работает, потому что нажатие на кнопку не удаляет фокус из выделенной ячейки.
Мотти Стром