
作りたいもの
Discord Botにあるモーダルウィンドウを活用してフォーム的な物を作成する。
Discord Botに実装した他の機能と合わせて使用できる、記録フォーム的なツールとして活用したい。
GASの記述
スプレッドシートを作成し、「拡張機能」から「Apps Script」をクリックしてエディタを開き、以下を記述する。
GAS
- function doGet(e) {
- //データ
- var dt = e.parameter.dt;
- var mail = e.parameter.mail;
- var name = e.parameter.name;
- var subject = e.parameter.subject;
- var contents = e.parameter.contents;
- //Activeになっているsheetを取得
- var sheet = SpreadsheetApp.getActiveSheet();
- //書き込み
- sheet.appendRow([dt, mail, name, subject, contents]);
- }
「デプロイ」から「新しいデプロイ」→「ウェブアプリ」→アクセスできるユーザーを全員に設定する。
これにより、URLを知っている全員がアクセス可能な状態になるため、URLの管理には注意する。
作成したウェブアプリのURLをメモする。
Botのプログラム
bot.py
- #!/usr/bin/python3
- import discord
- from discord.ext import commands
- import datetime
- import requests
- import datetime
- url = 'ウェブアプリURL'
- #スプレッドシートに記録するためのリクエスト用URLを作成
- def mkUrl(url, dt, mail, name, subject, contents):
- newUrl = url + '?'
- newUrl += 'dt=' + str(dt) + '&'
- newUrl += 'mail=' + str(mail) + '&'
- newUrl += 'name=' + str(name) + '&'
- newUrl += 'subject=' + str(subject) + '&'
- newUrl += 'contents=' + str(contents) + '&'
- return newUrl
- intents = discord.Intents.default()
- intents.message_content = True
- bot = commands.Bot(
- command_prefix=commands.when_mentioned_or("!"), debug_guilds=[サーバーID], intents=intents
- )
- client = discord.Client()
- channel = チャンネルID
- @bot.event
- async def on_ready():
- print('[INFO] <' + str(datetime.datetime.now().replace(microsecond=0)) + '> Bot is active')
- class MyModal(discord.ui.Modal):
- def __init__(self, *args, **kwargs) -> None:
- #setting mnodal
- super().__init__(
- discord.ui.InputText(
- label="Mail",
- placeholder="◯◯◯◯@◯◯◯◯◯◯",
- style=discord.InputTextStyle.short,
- required = True, #必須項目
- ),
- discord.ui.InputText(
- label="Name",
- placeholder="Python×Raspi",
- style=discord.InputTextStyle.short,
- required = True,
- ),
- discord.ui.InputText(
- label="Subject",
- placeholder="〇〇の件について",
- style=discord.InputTextStyle.short,
- required = True,
- ),
- discord.ui.InputText(
- label="Contents",
- placeholder="あsdfghjkl;:」",
- style=discord.InputTextStyle.long, #複数行
- required = True,
- ),
- *args,
- **kwargs,
- )
- async def callback(self, interaction: discord.Interaction):
- #Response
- embed = discord.Embed(
- title="Request",
- fields=[
- discord.EmbedField(
- name="> Mail", value=self.children[0].value, inline=False
- ),
- discord.EmbedField(
- name="> Name", value=self.children[1].value, inline=False
- ),
- discord.EmbedField(
- name="> Subject", value=self.children[2].value, inline=False
- ),
- discord.EmbedField(
- name="> Contents", value=self.children[3].value, inline=False
- ),
- ],
- color=discord.Color.from_rgb(153,170,181)
- )
- await interaction.response.defer()
- #ここからモーダルの処理
- dt = str(datetime.datetime.now().replace(microsecond=0))
- mail=self.children[0].value
- name=self.children[1].value
- subject=self.children[2].value
- contents=self.children[3].value
- #スプレッドシートに送信
- upUrl = mkUrl(url, dt, mail, name, subject, contents)
- requests.get(upUrl)
- await interaction.followup.send(embeds=[embed])
- @bot.slash_command(name="modal")
- async def modal_slash(ctx: discord.ApplicationContext):
- """Modal Window"""
- modal = MyModal(title="Modal Form")
- await ctx.send_modal(modal)
- bot.run("TOKEN")
実行結果


0 件のコメント:
コメントを投稿