誰かが「人間が想像できることは人間が必ず実現できる」という名言を残したように、自分が想像して実現できそうだと思えるものはほぼ実現できるので、実際に想像したものを仮説検証してみたくなります。しかしながら、日頃からその領域の仕事をしていればすぐに実現する手段がわかるのですが、自分の領域でなかったり、久しぶりすぎて忘れていたり、なかなか実現する手段がみつからない場合もあったりします。
そこで今回は、無料の ChatGPT 3.5 に聞きながら Excel ライクな入力を実現する Web アプリを作ってみました。
ChatGPT 3.5 に聞いたプロンプト
excelのような入力ができるuiでsqliteにデータ保存するサンプルコード
これをWebにしたサンプルコード
flaskでindex.htmlを配置するフォルダ名は?
javascriptでtableをExcelライクに使用するサンプルコード
console.logのあたりにsqliteに保存するサンプルコード
response.okの時にページリロードを追加
INSERT INTO dataの箇所にname age email が空じゃなかったらという条件を追加
ChatGPT 3.5 に聞いた例

ChatGPT 3.5 の回答を元に Flask アプリを作成
touch app.py
mkdir templates
touch templates/index.html
app.py のコード
from flask import Flask, render_template, request, jsonify
import sqlite3
app = Flask(__name__)
def create_table():
conn = sqlite3.connect('data.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS data
(id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER,
email TEXT)''')
conn.commit()
conn.close()
create_table()
@app.route('/')
def index():
conn = sqlite3.connect('data.db')
c = conn.cursor()
c.execute("SELECT * FROM data")
rows = c.fetchall()
conn.close()
return render_template('index.html', rows=rows)
@app.route('/saveData', methods=['POST'])
def save_data():
data = request.json
if not data:
return jsonify({'message': 'No data received'}), 400
conn = sqlite3.connect('data.db')
c = conn.cursor()
c.execute("DELETE FROM data")
for row in data:
c.execute("INSERT INTO data (name, age, email) VALUES (?, ?, ?)", (row['name'], row['age'], row['email']))
conn.commit()
conn.close()
return jsonify({'message': 'Data saved successfully'}), 200
if __name__ == '__main__':
app.run(debug=True)
index.html のコード
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Excel Like Table</title>
<style>
table {
border-collapse: collapse;
width: 100%;
}
table, th, td {
border: 1px solid black;
padding: 8px;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<table id="excelTable">
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr>
<td contenteditable="true">{{ row[1] }}</td>
<td contenteditable="true">{{ row[2] }}</td>
<td contenteditable="true">{{ row[3] }}</td>
</tr>
{% endfor %}
<tr>
<td contenteditable="true"></td>
<td contenteditable="true"></td>
<td contenteditable="true"></td>
</tr>
</tbody>
</table>
<button id="saveButton">Save Changes</button>
<script>
document.getElementById("saveButton").addEventListener("click", function() {
const table = document.getElementById("excelTable");
const data = [];
for (let i = 1; i < table.rows.length; i++) {
const row = table.rows[i];
const rowData = {
name: row.cells[0].textContent,
age: row.cells[1].textContent,
email: row.cells[2].textContent
};
if (rowData.name.trim() !== '' && rowData.age.trim() !== '' && rowData.email.trim() !== '') {
data.push(rowData);
}
}
// Send data to server
fetch('/saveData', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => {
if (response.ok) {
console.log('Data saved successfully.');
location.reload(); // Reload the page
} else {
console.error('Failed to save data.');
}
})
.catch(error => {
console.error('Error:', error);
});
});
</script>
</body>
</html>
作成した Web アプリを実行
python3 app.py
作成した Web アプリの画面
