Преобразовать Discord‑ID в упоминание <@ID> из Google Forms
Узнайте, как автоматически преобразовать Discord‑ID в упоминание <@ID> при отправке Google Forms в Discord через Webhook, включая настройку allowed_mentions.
Как автоматически преобразовать введённый игроком ID в Discord в формат <@ID> при отправке ответа из Google Forms в Discord через Webhook?
Я хочу, чтобы игроки в форме указывали только ID, но в Discord сообщение приходило в виде упоминания: <@DISCORD_ID>. Ниже я привожу скрипт, который я использую, но он ничего не меняет:
function onSubmit(e) {
const response = e.response.getItemResponses();
let items = [];
var num = 1;
for (const responseAnswer of response) {
const question = responseAnswer.getItem().getTitle();
let answer = responseAnswer.getResponse();
// Обработка различных типов вопросов
switch (responseAnswer.getItem().getType()) {
case FormApp.ItemType.CHECKBOX:
case FormApp.ItemType.CHECKBOX_GRID:
if (Array.isArray(answer)) {
if (CHECKBOX_STROKE) {
answer = answer.map(choice => `\`${choice}\``).join(CHECKBOX_SEPARATION);
} else {
answer = answer.join(CHECKBOX_SEPARATION);
}
}
break;
case FormApp.ItemType.GRID:
const gridItem = responseAnswer.getItem().asGridItem();
const rows = gridItem.getRows();
const columns = gridItem.getColumns();
if (Array.isArray(answer)) {
if (GRID_STROKE) {
answer = answer.map((selectedChoice, index) => `\`${rows[index]}: ${selectedChoice}\``).join(GRID_SEPARATION);
} else {
answer = answer.map((selectedChoice, index) => `${rows[index]}: ${selectedChoice}`).join(GRID_SEPARATION);
}
}
break;
case FormApp.ItemType.MULTIPLE_CHOICE:
if (Array.isArray(answer)) {
if (MULTIPLE_CHOICE_STROKE) {
answer = answer.map(choice => `\`${choice}\``).join(MULTIPLE_CHOICE_SEPARATION);
} else {
answer = answer.join(MULTIPLE_CHOICE_SEPARATION);
}
}
break;
}
if (!answer) {
continue;
}
if (NUMBER_QUESTION) {
items.push({
"name": `${num}. ${question}`,
"value": answer,
"inline": false
});
} else {
items.push({
"name": question,
"value": answer,
"inline": false
});
}
num += 1;
}
var TIMES = "";
if (TIMESTAMP) {
TIMES = new Date().toISOString();
}
function replaceTime(inputString) {
var TIME = `<t:${Math.floor(new Date().getTime() / 1000)}:R>`;
return inputString.replace(/\{TIME\}/g, TIME);
}
var options = {
"method": "post",
"headers": {
"Content-Type": "application/json",
},
"payload": JSON.stringify({
"content": replaceTime(CONTENT),
"embeds": [{
"title": replaceTime(TITLE),
"description": replaceTime(DESK),
"color": COLOR,
"fields": items,
"footer": {
"text": replaceTime(FOOTER)
},
"timestamp": TIMES
}],
username: USERNAME,
avatar_url: AVATAR_URL,
})
};
UrlFetchApp.fetch(WEB_HOOK, options);
}
Как изменить скрипт, чтобы в Discord сообщение автоматически преобразовывало введённый ID в формат <@ID>?
Как автоматически преобразовать введённый игроком Discord‑ID в упоминание <@ID>
при отправке ответа из Google Forms в Discord через Webhook.
1. Что нужно сделать
-
Преобразовать строку‑ID в формат
<@ID>
Внутри скрипта заменяем любое число, которое представлено как ответ, на строку‑упоминание.
Для пользователей Discord используется<@ID>(или<@!ID>для «пинг‑а»), для ролей –<@&ID>. -
Разрешить ping
Webhook по умолчанию отключает ping‑ы. Нужно добавить полеallowed_mentionsв запрос, чтобы Discord разрешил упоминание указанного пользователя.
2. Как реализовать
2.1. Функция‑помощник
/**
* Преобразует строку‑ID в Discord‑упоминание.
* Если строка содержит только цифры, возвращаем `<@ID>`,
* иначе возвращаем строку без изменений.
*/
function toDiscordMention(text) {
// Убираем пробелы, чтобы не пропустить ID с лишними символами
const trimmed = text.trim();
// Проверяем, что строка состоит только из цифр
if (/^\d+$/.test(trimmed)) {
return `<@${trimmed}>`;
}
return text;
}
2.2. Где вставлять
В цикле обработки ответов замените строку, где формируется answer, на использование toDiscordMention.
// ... внутри цикла for (const responseAnswer of response) { ... }
let answer = responseAnswer.getResponse();
// Применяем преобразование
answer = toDiscordMention(answer);
Важно: если в форме есть поле, где игрок вводит несколько ID (например, в чекбоксах или списках), применяйте
toDiscordMentionк каждому элементу массива.
2.3. Разрешаем ping в Webhook
Добавьте к объекту options поле allowed_mentions.
Для простоты разрешаем все пользовательские упоминания:
var options = {
"method": "post",
"headers": {
"Content-Type": "application/json",
},
"payload": JSON.stringify({
"content": replaceTime(CONTENT),
"embeds": [{
"title": replaceTime(TITLE),
"description": replaceTime(DESK),
"color": COLOR,
"fields": items,
"footer": {
"text": replaceTime(FOOTER)
},
"timestamp": TIMES
}],
"username": USERNAME,
"avatar_url": AVATAR_URL,
// Разрешаем ping всех упомянутых пользователей
"allowed_mentions": {
"parse": ["users"]
}
})
};
Если хотите ограничить список конкретными ID, можно передавать массив:
"allowed_mentions": {
"users": [answer] // answer – строка‑ID из формы
}
3. Полный пример (обрезка)
function onSubmit(e) {
const response = e.response.getItemResponses();
let items = [];
var num = 1;
function toDiscordMention(text) {
const trimmed = text.trim();
if (/^\d+$/.test(trimmed)) {
return `<@${trimmed}>`;
}
return text;
}
for (const responseAnswer of response) {
const question = responseAnswer.getItem().getTitle();
let answer = responseAnswer.getResponse();
// Применяем преобразование к каждому ответу
if (Array.isArray(answer)) {
answer = answer.map(toDiscordMention);
} else {
answer = toDiscordMention(answer);
}
// ... (остальной код обработки вопросов)
if (!answer) continue;
items.push({
name: NUMBER_QUESTION ? `${num}. ${question}` : question,
value: Array.isArray(answer) ? answer.join(CHECKBOX_SEPARATION) : answer,
inline: false
});
num++;
}
// ... (код со временем)
var options = {
"method": "post",
"headers": {"Content-Type": "application/json"},
"payload": JSON.stringify({
"content": replaceTime(CONTENT),
"embeds": [{
"title": replaceTime(TITLE),
"description": replaceTime(DESK),
"color": COLOR,
"fields": items,
"footer": {"text": replaceTime(FOOTER)},
"timestamp": TIMES
}],
"username": USERNAME,
"avatar_url": AVATAR_URL,
"allowed_mentions": {"parse": ["users"]} // <-- важно!
})
};
UrlFetchApp.fetch(WEB_HOOK, options);
}
4. Что теперь происходит
- Игрок вводит в форму только числовой ID.
- Скрипт преобразует его в строку
<@ID>. - В payload Webhook добавлено поле
allowed_mentions, поэтому Discord корректно интерпретирует<@ID>как упоминание пользователя и отправляет ping.
5. Быстрый чек‑лист
- [ ] Вставьте функцию
toDiscordMentionв ваш скрипт. - [ ] Применяйте её к каждому ответу (массивы/строки).
- [ ] Добавьте
allowed_mentionsв запрос Webhook. - [ ] Проверьте, что в Discord сообщение содержит «пинг» и упоминание.
Готово! Теперь игроки могут просто вводить ID, а в Discord они автоматически превращаются в упоминания.