#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-таблицы
Вопрос:
У меня есть Google Sheet со скриптом .gs, который успешно генерирует параметры dynamicnewRichTextValue(), которые предназначены для ввода в ячейку листа, которая будет содержать несколько строк текста, каждая со своим собственным URL. Я не знаю всех параметров заранее (это может быть один текст и одна ссылка, или по две, или больше), поэтому я динамически генерирую параметры.
Допустим, конечное состояние должно быть таким (в этом случае есть только две строки, но их может быть больше или меньше:
var RichTextValue=SpreadsheetApp.newRichTextValue()
.setText("mailto:fred@abcdef.com,mailto:jim@abcdef.com")
.setLinkUrl(0,6,"mailto:fred@abcdef.com")
.setLinkUrl(7,19,"mailto:jim@abcdef.com")
.build();
В моем скрипте я не знаю, сколько параметров «setText» или операторов «setLinkUrl» мне нужно будет сгенерировать, поэтому я делаю это динамически.
Это просто обработать для «setText», потому что я могу просто передать одну переменную, созданную во время более раннего цикла, который создает параметры «setText». Давайте вызовем эту переменную setTextContent , и она будет работать следующим образом:
var RichTextValue=SpreadsheetApp.newRichTextValue()
.setText(setTextContent)
Так что до этого момента все было замечательно. Проблема в том, что у меня есть другая переменная, которая генерирует URL-адресную часть параметров newrichtextvalue() вплоть до инструкции «.build();». Итак, давайте вызовем эту переменную setUrlContent, и она будет встроена в более ранний цикл и содержит строку для остальной части инструкции:
.setLinkURL(0,22,"mailto:fred@abcdef.com").setLinkURL(23,44,"mailto:jim@abcdef.com")
Я в тупике, пытаясь понять, как прикрепить его к предыдущему фрагменту. Я чувствую, что это что-то простое, о чем я забываю. Но я не могу найти его после долгих исследований. Как мне подключить setUrlContent к приведенному выше коду, чтобы команда выполнялась? Я хочу присоединить приведенные выше фрагменты и вернуться к присвоению всего этого переменной, которую я могу поместить в ячейку:
var emailCell=SpreadsheetApp.newRichTextValue()
.setText("mailto:fred@abcdef.com,mailto:jim@abcdef.com") // I can dynamically create up to here
.setLinkUrl(0,6,"mailto:fred@abcdef.com") // ...but these last couple lines are
.setLinkUrl(7,19,"mailto:jim@abcdef.com") // stuck in a string variable.
.build();
sheet.getRange(1,1,1,1).setRichTextValue(emailCell)
Спасибо!
Ответ №1:
Я полагаю, что ваша цель и ситуация заключаются в следующем.
- Вы хотите использовать свой скрипт, динамически изменяя количество электронных писем.
Точки модификации:
- Когда запускается ваш следующий скрипт, я думаю, что ссылки отображаются на
mailto
иfred@abcdef.
.var emailCell=SpreadsheetApp.newRichTextValue() .setText("mailto:fred@abcdef.com,mailto:jim@abcdef.com") .setLinkUrl(0,6,"mailto:fred@abcdef.com") .setLinkUrl(7,19,"mailto:jim@abcdef.com") .build(); sheet.getRange(1,1,1,1).setRichTextValue(emailCell)
- Я подумал, что вам, возможно, нужны связанные адреса электронной почты, как показано ниже.
fred@abcdef.com
имеет ссылкуmailto:fred@abcdef.com
.jim@abcdef.com
имеет ссылкуmailto:jim@abcdef.com
.
В этом ответе я хотел бы предложить модифицированный сценарий для вышеуказанного направления.
Модифицированный скрипт:
var inputText = "mailto:fred@abcdef.com,mailto:jim@abcdef.com"; // This is your sample text value.
var ar = inputText.split(",").map(e => {
var v = e.trim();
return [v.split(":")[1], v];
});
var text = ar.map(([e]) => e).join(",");
var emailCell = SpreadsheetApp.newRichTextValue().setText(text);
var start = 0;
ar.forEach(([t, u], i) => {
var len = t.length;
emailCell.setLinkUrl(start, start len, u);
start = len 1;
});
SpreadsheetApp.getActiveSheet().getRange(1,1,1,1).setRichTextValue(emailCell.build());
- В этой модификации
inputText
разделяется на гиперссылку и текст (например, когда используется ваше примерное значение, этоfred@abcdef.com
иmailto:fred@abcdef.com
.), А текст, включая гиперссылку, помещается в ячейку. - В этом случае, например, даже при
var inputText = "mailto:fred@abcdef.com,mailto:jim@abcdef.com"
изменении наvar inputText = "mailto:fred@abcdef.com"
иvar inputText = "mailto:fred@abcdef.com,mailto:jim@abcdef.com,mailto:sample@abcdef.com"
каждая гиперссылка отражается в каждом тексте.
Примечание:
- Если вы хотите получить гиперссылку
mailto:fred@abcdef.com
на текстmailto:fred@abcdef.com
, вы также можете использовать следующий модифицированный скрипт.var inputText = "mailto:fred@abcdef.com,mailto:jim@abcdef.com"; // This is your sample text value. var ar = inputText.split(",").map(e => e.trim()); var emailCell = SpreadsheetApp.newRichTextValue().setText(inputText); var start = 0; ar.forEach((t, i) => { var len = t.length; emailCell.setLinkUrl(start, start len, t); start = len 1; }); SpreadsheetApp.getActiveSheet().getRange(1,1,1,1).setRichTextValue(emailCell.build());