Создание гиперссылки Googlesheet с использованием GoogleScripts - PullRequest
0 голосов
/ 28 марта 2020

Используя приведенный ниже код, я могу сгенерировать гиперссылку на каждую страницу в моем листе googles с именем этого листа:

/**
 * Gets the Sheet Name of a selected Sheet.
 *
 * @param {number} option 0 - Current Sheet, 1  All Sheets, 2 Spreadsheet filename
 * @return The input multiplied by 2.
 * @customfunction
 */

function SHEETNAME(option) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet()
  var thisSheet = sheet.getName();
  var thisgid = sheet.getSheetId();

  //Current option Sheet Name
  if(option === 0){
    return thisSheet;

  //All Sheet Names in Spreadsheet
  }else if(option === 1){

    var sheet1 = [];
    ss.getSheets().forEach(function(val){
      sheet1.push(`=HYPERLINK("#gid=${val.getSheetId()}","${val.getName()}")`)
    });
    return sheet1;  

  //The Spreadsheet File Name
  }else if(option === 2){
    return ss.getName();

  //Error  
  }else{
    return "#N/A";
  };
};

 function GETLINK(option) {
   var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(option);
if (sheet != null) {
  return(sheet.getId());
};
 };

Возвращает столбец соответствующих функций в каждой ячейке, но не оценить функцию. Если я скопирую функцию в другую ячейку, она действительно оценивает ?!

=HYPERLINK("#gid=XXXXXXXXXXXXX","SHEET1")

Я пытался также попытаться добавить HTML, но это также становится строкой и не оценивается

sheet1.push(`<a href="#gid=${val.getSheetId()}">${val.getName()}</a>)

1 Ответ

2 голосов
/ 28 марта 2020
  • Когда пользовательская формула =SHEETNAME(0) помещается в ячейку, вы хотите поместить имя листа активного листа в электронную таблицу.
  • Когда пользовательская формула =SHEETNAME(1) имеет значение положить в ячейку, вы хотите поместить формулы =HYPERLINK("#gid=XXXXXXXXXXXXX","SHEET1") для всех листов.
  • Когда пользовательская формула =SHEETNAME(2) помещается в ячейку, вы хотите поместить имя электронной таблицы активной электронной таблицы .

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

Проблема и обходное решение:

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

В качестве обходного пути я хотел бы предложить поместить формулу =HYPERLINK("#gid=XXXXXXXXXXXXX","SHEET1"), используя триггер события OnEdit, когда пользовательская формула =SHEETNAME(#) установлена ​​в клетка. Я думаю, что с помощью этого обходного пути ваша цель может быть достигнута.

Когда ваш скрипт будет изменен, пожалуйста, измените его следующим образом.

Измененный скрипт:

В этом случае простой триггер может быть использован. Поэтому, пожалуйста, скопируйте и вставьте следующий скрипт в редактор скриптов и сохраните скрипт. Чтобы использовать этот скрипт в качестве теста, пожалуйста, поместите =SHEETNAME(1) в ячейку.

function onEdit(e) {
  const spreadsheet = e.source;
  const range = e.range;
  const sheet = range.getSheet();
  const formula = range.getFormula();
  const f = formula.match(/\=SHEETNAME\((\d+)\)/i);
  if (f && f.length > 0) {
    if (f[1] == "0") {
      range.setValue(sheet.getSheetName());
    } else if (f[1] == "1") {
      var formulas = spreadsheet.getSheets().map(val => [`=HYPERLINK("#gid=${val.getSheetId()}","${val.getName()}")`]);
      range.offset(0, 0, formulas.length, 1).setFormulas(formulas);
    } else if (f[1] == "2") {
      range.setValue(spreadsheet.getName());
    }
  }
}
  • В этом случае есть функция SHEETNAME() в вашем редакторе скриптов. Поэтому, когда =SHEETNAME(1) помещается в ячейку, сначала запускается функция SHEETNAME(), а затем функция onEdit автоматически запускается триггером события OnEdit. Если вы не хотите показывать значения из SHEETNAME(), замените функцию SHEETNAME() следующим образом.

    const SHEETNAME = () => "";
    

Примечание:

  • В этом случае при непосредственном запуске функции onEdit в редакторе сценариев возникает ошибка. Пожалуйста, будьте осторожны.
  • Этот скрипт запускается под V8.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я приношу свои извинения .

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