Веб

Преобразовать 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>. Ниже я привожу скрипт, который я использую, но он ничего не меняет:

javascript
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. Что нужно сделать

  1. Преобразовать строку‑ID в формат <@ID>
    Внутри скрипта заменяем любое число, которое представлено как ответ, на строку‑упоминание.
    Для пользователей Discord используется <@ID> (или <@!ID> для «пинг‑а»), для ролей – <@&ID>.

  2. Разрешить ping
    Webhook по умолчанию отключает ping‑ы. Нужно добавить поле allowed_mentions в запрос, чтобы Discord разрешил упоминание указанного пользователя.


2. Как реализовать

2.1. Функция‑помощник

js
/**
 * Преобразует строку‑ID в Discord‑упоминание.
 * Если строка содержит только цифры, возвращаем `<@ID>`,
 * иначе возвращаем строку без изменений.
 */
function toDiscordMention(text) {
  // Убираем пробелы, чтобы не пропустить ID с лишними символами
  const trimmed = text.trim();
  // Проверяем, что строка состоит только из цифр
  if (/^\d+$/.test(trimmed)) {
    return `<@${trimmed}>`;
  }
  return text;
}

2.2. Где вставлять

В цикле обработки ответов замените строку, где формируется answer, на использование toDiscordMention.

js
// ... внутри цикла for (const responseAnswer of response) { ... }

let answer = responseAnswer.getResponse();

// Применяем преобразование
answer = toDiscordMention(answer);

Важно: если в форме есть поле, где игрок вводит несколько ID (например, в чекбоксах или списках), применяйте toDiscordMention к каждому элементу массива.

2.3. Разрешаем ping в Webhook

Добавьте к объекту options поле allowed_mentions.
Для простоты разрешаем все пользовательские упоминания:

js
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, можно передавать массив:

js
"allowed_mentions": {
  "users": [answer]   // answer – строка‑ID из формы
}

3. Полный пример (обрезка)

js
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. Что теперь происходит

  1. Игрок вводит в форму только числовой ID.
  2. Скрипт преобразует его в строку <@ID>.
  3. В payload Webhook добавлено поле allowed_mentions, поэтому Discord корректно интерпретирует <@ID> как упоминание пользователя и отправляет ping.

5. Быстрый чек‑лист

  • [ ] Вставьте функцию toDiscordMention в ваш скрипт.
  • [ ] Применяйте её к каждому ответу (массивы/строки).
  • [ ] Добавьте allowed_mentions в запрос Webhook.
  • [ ] Проверьте, что в Discord сообщение содержит «пинг» и упоминание.

Готово! Теперь игроки могут просто вводить ID, а в Discord они автоматически превращаются в упоминания.

Авторы
Проверено модерацией
Модерация