Как я могу автоматически превратить значение столбца в таблицах Google в гиперссылку на основе этого значения?

#google-apps-script #google-sheets #jira

Вопрос:

У меня есть лист, где в одной колонке содержится идентификатор билета Jira.

Я хотел бы автоматически преобразовать это в ссылку на билет на основе введенного мной значения.

Например, я введу SD-1234 в столбец, и я хотел бы, чтобы затем он превратился в кликабельную ссылку на https://demo.atlassian.net/browse/SD-1234/, но не показывать URL-адрес в ячейке, а исходное значение, которое я ввел (SD-1234).

Колонка всегда E, если это помогает. Кто-нибудь может дать мне представление о том, как написать это в редакторе сценариев?

Ответ №1:

Например, когда используется ячейка «E1» SD-1234 , =HYPERLINK("https://demo.atlassian.net/browse/"amp;E1, E1) значение SD-1234 имеет гиперссылку https://demo.atlassian.net/browse/SD-1234 . Но в этом случае результат не может быть непосредственно показан в ячейке «E1». Если вы хотите напрямую преобразовать SD-1234 ячейку «E1» в SD-1234 с гиперссылкой https://demo.atlassian.net/browse/SD-1234 , как насчет следующего примера сценария?

Пример сценария:

Пожалуйста, скопируйте и вставьте следующий сценарий и запустите функцию в редакторе сценариев. Прежде чем использовать это, пожалуйста, укажите имя листа.

Этот пример сценария преобразуется из SD-1234 столбца «E» в =HYPERLINK("https://demo.atlassian.net/browse/SD-1234", "SD-1234") .

 function sample1() {
  const sheetName = "Sheet1"; // Please set the sheet name.
  const baseUrl = "https://demo.atlassian.net/browse/";
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const range = sheet.getRange("E1:E"   sheet.getLastRow());
  const values = range.getValues().map(([e]) => [`=HYPERLINK("${baseUrl}${e}", "${e}")`]);
  range.setFormulas(values);
}
 

Этот пример сценария преобразуется из SD-1234 столбца «E» в SD-1234 с гиперссылкой https://demo.atlassian.net/browse/SD-1234 . В этом случае формула не используется.

 function sample2() {
  const sheetName = "Sheet1"; // Please set the sheet name.
  const baseUrl = "https://demo.atlassian.net/browse/";
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  const range = sheet.getRange("E1:E"   sheet.getLastRow());
  const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl   e).build()]);
  range.setRichTextValues(values);
}
 

Примечание:

  • Если в вашей электронной таблице есть 1-я строка заголовка, пожалуйста, измените "E1:E" sheet.getLastRow() ее на "E2:E" sheet.getLastRow() .

Рекомендации:

Добавлено 1:

Из ваших следующих комментариев,

Нужно ли мне указывать имя листа? У меня есть несколько листов, к которым я всегда хочу применять эту функцию (в настоящее время в файле более 20 листов).

Кроме того, я ввел это в редактор сценариев для тестирования, и что мне теперь делать? Кроме этого, я ничего не вижу… и это не написано на моем листе. Как я могу применить это к своему листу, чтобы автоматически запускаться всякий раз, когда значение вводится в ячейку?

Когда описанные выше ситуации отражены в сценарии, он становится следующим.

Пример сценария:

Пожалуйста, скопируйте и вставьте следующий сценарий в редактор сценариев и сохраните его. И, пожалуйста, отредактируйте колонку «Е» листа. При этом в ячейке появляется гиперссылка с введенным текстом.

 function onEdit(e) {
  const sheetNames = ["Sheet1", "Sheet2",,,]; // Please set the sheet names you want to run the script.
  const column = 5; // Column E. From your question, this script run for the column "E".

  const {range} = e;
  const sheet = range.getSheet();
  const baseUrl = "https://demo.atlassian.net/browse/";
  if (!sheetNames.includes(sheet.getSheetName()) || range.columnStart != column) return;
  const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl   e).build()]);
  range.setRichTextValues(values);
}
 

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

 function onEdit(e) {
  const column = 5; // Column E. From your question, this script run for the column "E".

  const {range} = e;
  const sheet = range.getSheet();
  const baseUrl = "https://demo.atlassian.net/browse/";
  if (range.columnStart != column) return;
  const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl   e).build()]);
  range.setRichTextValues(values);
}
 

Добавлено 2:

Если вы хотите запустить сценарий в столбец «E» всех листов с помощью одного запущенного сценария, вы также можете использовать следующий сценарий.

Пример сценария:

Этот пример сценария выполняется для определенных листов.

 function myFunction() {
  const sheetNames = ["Sheet1", "Sheet2",,,]; // Please set sheet names you want to run the script.

  const baseUrl = "https://demo.atlassian.net/browse/";
  SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(sheet => {
    if (!sheetNames.includes(sheet.getSheetName())) return;
    const range = sheet.getRange("E1:E"   sheet.getLastRow());
    const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl   e).build()]);
    range.setRichTextValues(values);
  });
}
 

Этот пример сценария выполняется для всех листов.

 function myFunction() {
  const baseUrl = "https://demo.atlassian.net/browse/";
  SpreadsheetApp.getActiveSpreadsheet().getSheets().forEach(sheet => {
    const range = sheet.getRange("E1:E"   sheet.getLastRow());
    const values = range.getValues().map(([e]) => [SpreadsheetApp.newRichTextValue().setText(e).setLinkUrl(baseUrl   e).build()]);
    range.setRichTextValues(values);
  });
}
 

Комментарии:

1. Нужно ли мне указывать имя листа? У меня есть несколько листов, к которым я всегда хочу применять эту функцию (в настоящее время в файле более 20 листов).

2. @Lee Спасибо, что ответили. Я должен извиниться за свое плохое знание английского языка. К сожалению, из вашего вопроса я не смог понять такие ситуации в ваших комментариях. Я глубоко извиняюсь за это. Когда ситуации в ваших комментариях отражены в сценарии, пример сценария похож на приведенный выше. Пожалуйста, подтвердите это. Если я неправильно понял ваш вопрос, я еще раз приношу свои извинения.

3. @Lee Я беспокоюсь, правильно ли я понял ваш вопрос. Поэтому я добавил в свой ответ еще один пример сценария. Не могли бы вы, пожалуйста, подтвердить это? Если это было бесполезно, я еще раз приношу свои извинения.

4. Пожалуйста, не загромождайте сообщения в ответ извинениями за непонимание чего — либо-Переполнение стека-это не чат. Обратитесь за разъяснениями в комментариях, а затем отредактируйте сообщение. Если вы вообще не понимаете вопроса, пожалуйста, воздержитесь от ответа, пока не поймете.

5. Помните, что ответы — это не разговор между вами и плакатом . Они являются частью обобщенных вопросов и ответов, которые полезны для многих читателей. Имейте в виду эту общую аудиторию, когда будете отвечать, и если вам также удастся помочь автору вопроса, это еще лучше.