ืืขืื | ๐ช apps script, ืื ืื ื ืืคืกืคืกโ๏ธ
-
@ืจืคื-ืกืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ื ืืคืจื?
ืืื ื ืืชื ืื ืืฉืืืจ?ื ืืคืจื ืื ืืืคืฉืจืื ืืฉืืืจ ืจืง ืกืงืจืืคื ืฉืคืื ื ืืืชืืืืช URL ืืืฆืื ืืืช. ืืื ืื ืืฉืคืจื ืข"ื ืืงืฉื ืืืขืจืืช ืืคื ืืืช
@ืข-ื-ืืื-ืข (ืืื ืื ืฉืืื ืขืืฉื....)
ืืื ืืคืขืืื ื ืืคืจื ืืืกื ืืืคืคืก ืกืงืจืืคื ืกืชื
-
@ืข-ื-ืืื-ืข (ืืื ืื ืฉืืื ืขืืฉื....)
ืืื ืืคืขืืื ื ืืคืจื ืืืกื ืืืคืคืก ืกืงืจืืคื ืกืชื
@ืจืคื-ืกืื ืืื ืืชื ืฉืืกืืฃ ืื ืื ืขืืื ืื ืฉืื ืืกืชืืจ ืฉืื ื ืืคืจื
-
@ืข-ื-ืืื-ืข (ืืื ืื ืฉืืื ืขืืฉื....)
ืืื ืืคืขืืื ื ืืคืจื ืืืกื ืืืคืคืก ืกืงืจืืคื ืกืชื
@ืจืคื-ืกืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข (ืืื ืื ืฉืืื ืขืืฉื....)
ืืื ืืคืขืืื ื ืืคืจื ืืืกื ืืืคืคืก ืกืงืจืืคื ืกืชื
ืืืคื ืืชื ืจืืื ืฉืื ืื ืฉืืื ืขืืฉื?
-
ืฉืืื ืืืจืื ืื ื ืื ืกื ืืืจ ืชืงืืคื ืืจืืื ืืืฆืืจ ืกืงืจืืคืืื ื apps script ืขื ืืื gpt, ืืืจื ืืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื, ืืื ืชืืื ืืกืงืจืืคื ืื ืขืืื, ืืืคืืข ืื "ืฉืืืื ืืฉืืืืช ืืืงืฉื,"
ืืืืจ ืฉืขืืช ืืื ืคืขื ืืืืฉ, ืฉืื ื ืืฉื ื ืืืจืื ืคืืจืก 10 ืคืขืืื, ืืืืง, ืืฉืืืจ, ืคืืชื, ืืกืืืจ, ืืื' ืืื' ืืื' ืืกืืฃ ืืกืงืจืืคื ืืกืืื ืืขืืื,ืฉืืืชื ืืืคื ืืช ืืืืื ืจืืืชืื ืืืืืืื, ืืื ืืฉ ืืฉืื ืฉืื ื ืืคืกืคืก? ืืื ืืฉ ืืืง ืืกืืืื ืฉืฆืจืื ืืฉืื ืื ืืืื ืืฆืืจื ืืืืืืช? ืืฉืื ืชืฉืืืจื ืืช ืขืื ื, ืืื ืฆืจืื ืืคืจื ืืืชืจ ืื ืืงืื ืื ืืกืงืจืืคื ืืื' ืคืฉืื ืชืืืื...
ืชืืื ืจืื ืืจืืฉ .@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
ืืืจื ืืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื
ืื ื
-
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
ืืืจื ืืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื
ืื ื
@ืจืคื-ืกืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
ืืืจื ืืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื
ืื ื
ื ืืคืจื ืืืกืืื ืกืงืจืืคื ืฉืคืื ื ืืืฃ ืืื ืืจื ื, ืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื.
-
@ืจืคื-ืกืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
ืืืจื ืืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื
ืื ื
ื ืืคืจื ืืืกืืื ืกืงืจืืคื ืฉืคืื ื ืืืฃ ืืื ืืจื ื, ืื ืืฃ ืืื ืืจื ื ืฉืคืื ื ืืกืงืจืืคื.
@ืข-ื-ืืื-ืข ืื ืืื ื ืฉืืข ืื....
-
@ืข-ื-ืืื-ืข ืื ืืื ื ืฉืืข ืื....
@ืจืคื-ืกืื
ืื ืืื ืขืืฉืื ืื ื ื ืื ืก ืืคื, ืืืืจ ืืจืื ืืื ืืื ื ืจืืื ืฉืื ืืฉื ื ืืื ืืืฉ ืืืจืืื....
ื. ืืืคื ืื ื ืืืื ืืืืืง ืืช ืืืืื ืืงืฉืืช ื apps script ืืืืืืง ืืื ืืืงืฉืืช ืืืื ืืชืงืืื?
ื. ืชืืื ืจืื ืืื ืืขืืืจืื ืืืืกืืืขืื.ื. ืื ื ืื ืื ืืคืจื.
ืื ืื ื ืืืฅ ืื ื ืืฉืชืฃ ืืช ืืกืงืจืืคื, (ืืืชืืื ืื ืฉืืืชื ืื ืืฉืืชื ืฉืื ืืืื ืืืืฉืื ืื ืืขืืืจ ืขื ืื, ืืื ืื ื ืจืืื ืฉืื ืฉืื ืคื ืืืื ืืืื ืืืืืื ืืขืืืจ,
)
-
@ืจืคื-ืกืื
ืื ืืื ืขืืฉืื ืื ื ื ืื ืก ืืคื, ืืืืจ ืืจืื ืืื ืืื ื ืจืืื ืฉืื ืืฉื ื ืืื ืืืฉ ืืืจืืื....
ื. ืืืคื ืื ื ืืืื ืืืืืง ืืช ืืืืื ืืงืฉืืช ื apps script ืืืืืืง ืืื ืืืงืฉืืช ืืืื ืืชืงืืื?
ื. ืชืืื ืจืื ืืื ืืขืืืจืื ืืืืกืืืขืื.ื. ืื ื ืื ืื ืืคืจื.
ืื ืื ื ืืืฅ ืื ื ืืฉืชืฃ ืืช ืืกืงืจืืคื, (ืืืชืืื ืื ืฉืืืชื ืื ืืฉืืชื ืฉืื ืืืื ืืืืฉืื ืื ืืขืืืจ ืขื ืื, ืืื ืื ื ืจืืื ืฉืื ืฉืื ืคื ืืืื ืืืื ืืืืืื ืืขืืืจ,
)
@ืืชืขื ืืื-ืืืื
ืืช ืืืื ืืคืฉืจ ืืจืืืช ืืืจืืืกืืืช ืืคืขืืืช. ืืืงื ืงืฆืช ืืื ืขื ืฉืืื ื ืจืฉื ืฉื. -
@ืืชืขื ืืื-ืืืื
ืืช ืืืื ืืคืฉืจ ืืจืืืช ืืืจืืืกืืืช ืืคืขืืืช. ืืืงื ืงืฆืช ืืื ืขื ืฉืืื ื ืจืฉื ืฉื.@ืข-ื-ืืื-ืข
ืชืืื, ืืืืง.... -
ืืกืงืจืืคื ืืกืคืืืืืจ
const SHEET_ID = "id ืฉื ืืืืืื ืฉืืืก"; // ืขืืื function doPost(e) { try { const data = JSON.parse(e.postData.contents || "{}"); const answer = (data.answer || "").toString().trim(); const token = (data.token || "").toString().trim(); const name = (data.name || "").toString().trim(); const email = (data.email || "").toString().trim(); if (!answer || !token) { return ContentService.createTextOutput(JSON.stringify({status:"error", message:"missing answer or token"})).setMimeType(ContentService.MimeType.JSON); } const ss = SpreadsheetApp.openById(SHEET_ID); // ืืืื ืฉืืฉ ืืืืื ืืืืงื ืื ืืฉื ืืืืืื ื ืงืจื "Tokens" let tokensSheet = ss.getSheetByName("Tokens"); if (!tokensSheet) { // ืฆืืจ ืืืืื Tokens ืขื ืืืชืจืช ืื ืื ืงืืื tokensSheet = ss.insertSheet("Tokens"); tokensSheet.appendRow(["Token","Name","Email","Used"]); } // Responses sheet let respSheet = ss.getSheetByName("Responses"); if (!respSheet) { respSheet = ss.insertSheet("Responses"); respSheet.appendRow(["Timestamp","Token","Name","Email","Answer"]); } // ืงืจื ืืช ืื ืืืืงื ืื (ืืกืคืืง ืืืืืืื ืืช ืงืื ืื/ืืื ืื ืืื) const tokenData = tokensSheet.getDataRange().getValues(); // ืืืื ืืืชืจืช let foundRow = -1; for (let i = 1; i < tokenData.length; i++) { if (tokenData[i][0].toString().trim() === token) { foundRow = i + 1; // ืืกืคืจ ืฉืืจืช ืืืืืืื (1-indexed) break; } } if (foundRow === -1) { return ContentService.createTextOutput(JSON.stringify({status:"error", message:"invalid token"})).setMimeType(ContentService.MimeType.JSON); } const usedVal = tokensSheet.getRange(foundRow, 4).getValue(); // ืขืืืื D = Used if (usedVal && usedVal.toString().toLowerCase() === "used") { return ContentService.createTextOutput(JSON.stringify({status:"error", message:"token already used"})).setMimeType(ContentService.MimeType.JSON); } // ืืืคืฆืืื ืื: ืืืืง ืืชืืื ืฉื ืฉื/ืืืืืื (ืื ืืจืฆืื ื ืืืืฅ ืืชืืื) // const registeredName = tokensSheet.getRange(foundRow, 2).getValue().toString().trim(); // if (registeredName && name && registeredName !== name) { ... } // ืกืื ืืช ืืืืงื ืึพUsed ืืชืขื ืืื ืืฉื/ืืืื ืื ืชืจืฆื tokensSheet.getRange(foundRow, 4).setValue("used"); // ืจืฉืื ืืช ืืืฆืืขื ืึพResponses respSheet.appendRow([new Date(), token, name, email, answer]); return ContentService.createTextOutput(JSON.stringify({status:"ok"})).setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({status:"error", message: err.message})).setMimeType(ContentService.MimeType.JSON); } } function doGet(e) { try { const mode = (e.parameter.mode || "").toString(); const ss = SpreadsheetApp.openById(SHEET_ID); const sheet = ss.getSheetByName("Responses"); if (!sheet) return ContentService.createTextOutput(JSON.stringify({})).setMimeType(ContentService.MimeType.JSON); const data = sheet.getDataRange().getValues(); const counts = {}; let total = 0; for (let i = 1; i < data.length; i++) { const ans = data[i][4]; // Answer column (E) if (!ans) continue; counts[ans] = (counts[ans] || 0) + 1; total++; } const percentages = {}; for (const k in counts) { percentages[k] = Math.round((counts[k] / total) * 100); } return ContentService.createTextOutput(JSON.stringify(percentages)).setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({status:"error", message: err.message})).setMimeType(ContentService.MimeType.JSON); } }
ื .ื. ืื ืืื ืืชืื ืจืืื...
-
ืืกืงืจืืคื ืืกืคืืืืืจ
const SHEET_ID = "id ืฉื ืืืืืื ืฉืืืก"; // ืขืืื function doPost(e) { try { const data = JSON.parse(e.postData.contents || "{}"); const answer = (data.answer || "").toString().trim(); const token = (data.token || "").toString().trim(); const name = (data.name || "").toString().trim(); const email = (data.email || "").toString().trim(); if (!answer || !token) { return ContentService.createTextOutput(JSON.stringify({status:"error", message:"missing answer or token"})).setMimeType(ContentService.MimeType.JSON); } const ss = SpreadsheetApp.openById(SHEET_ID); // ืืืื ืฉืืฉ ืืืืื ืืืืงื ืื ืืฉื ืืืืืื ื ืงืจื "Tokens" let tokensSheet = ss.getSheetByName("Tokens"); if (!tokensSheet) { // ืฆืืจ ืืืืื Tokens ืขื ืืืชืจืช ืื ืื ืงืืื tokensSheet = ss.insertSheet("Tokens"); tokensSheet.appendRow(["Token","Name","Email","Used"]); } // Responses sheet let respSheet = ss.getSheetByName("Responses"); if (!respSheet) { respSheet = ss.insertSheet("Responses"); respSheet.appendRow(["Timestamp","Token","Name","Email","Answer"]); } // ืงืจื ืืช ืื ืืืืงื ืื (ืืกืคืืง ืืืืืืื ืืช ืงืื ืื/ืืื ืื ืืื) const tokenData = tokensSheet.getDataRange().getValues(); // ืืืื ืืืชืจืช let foundRow = -1; for (let i = 1; i < tokenData.length; i++) { if (tokenData[i][0].toString().trim() === token) { foundRow = i + 1; // ืืกืคืจ ืฉืืจืช ืืืืืืื (1-indexed) break; } } if (foundRow === -1) { return ContentService.createTextOutput(JSON.stringify({status:"error", message:"invalid token"})).setMimeType(ContentService.MimeType.JSON); } const usedVal = tokensSheet.getRange(foundRow, 4).getValue(); // ืขืืืื D = Used if (usedVal && usedVal.toString().toLowerCase() === "used") { return ContentService.createTextOutput(JSON.stringify({status:"error", message:"token already used"})).setMimeType(ContentService.MimeType.JSON); } // ืืืคืฆืืื ืื: ืืืืง ืืชืืื ืฉื ืฉื/ืืืืืื (ืื ืืจืฆืื ื ืืืืฅ ืืชืืื) // const registeredName = tokensSheet.getRange(foundRow, 2).getValue().toString().trim(); // if (registeredName && name && registeredName !== name) { ... } // ืกืื ืืช ืืืืงื ืึพUsed ืืชืขื ืืื ืืฉื/ืืืื ืื ืชืจืฆื tokensSheet.getRange(foundRow, 4).setValue("used"); // ืจืฉืื ืืช ืืืฆืืขื ืึพResponses respSheet.appendRow([new Date(), token, name, email, answer]); return ContentService.createTextOutput(JSON.stringify({status:"ok"})).setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({status:"error", message: err.message})).setMimeType(ContentService.MimeType.JSON); } } function doGet(e) { try { const mode = (e.parameter.mode || "").toString(); const ss = SpreadsheetApp.openById(SHEET_ID); const sheet = ss.getSheetByName("Responses"); if (!sheet) return ContentService.createTextOutput(JSON.stringify({})).setMimeType(ContentService.MimeType.JSON); const data = sheet.getDataRange().getValues(); const counts = {}; let total = 0; for (let i = 1; i < data.length; i++) { const ans = data[i][4]; // Answer column (E) if (!ans) continue; counts[ans] = (counts[ans] || 0) + 1; total++; } const percentages = {}; for (const k in counts) { percentages[k] = Math.round((counts[k] / total) * 100); } return ContentService.createTextOutput(JSON.stringify(percentages)).setMimeType(ContentService.MimeType.JSON); } catch (err) { return ContentService.createTextOutput(JSON.stringify({status:"error", message: err.message})).setMimeType(ContentService.MimeType.JSON); } }
ื .ื. ืื ืืื ืืชืื ืจืืื...
@ืืชืขื ืืื-ืืืื ื ื, ืืกืงืจืืคื ืืื ืืฆืืจืชื ืื ืขืืื ืื ืืื?
ืืืืื ืืืจื ืฉืืชื ืืื ืืก ID ืืืืชื ืฉื ืืืืืื
-
@ืืชืขื ืืื-ืืืื ื ื, ืืกืงืจืืคื ืืื ืืฆืืจืชื ืื ืขืืื ืื ืืื?
ืืืืื ืืืจื ืฉืืชื ืืื ืืก ID ืืืืชื ืฉื ืืืืืื
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื? -
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?ืืื ืืื ืขืืืื ืืืื ืกืืืจ ืื ืืคืจื.
ืืื ืืืื ืชืืชืื ืืืชื ืืื ืฉื ืืื ืืจืืืช ืื ืืคืจืืืจืื ืURL ื ืืื ืื ืืืชืืืืื
-
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?ืืื ืืื ืขืืืื ืืืื ืกืืืจ ืื ืืคืจื.
ืืื ืืืื ืชืืชืื ืืืชื ืืื ืฉื ืืื ืืจืืืช ืื ืืคืจืืืจืื ืURL ื ืืื ืื ืืืชืืืืื
@ืข-ื-ืืื-ืข ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?ืืื ืืื ืขืืืื ืืืื ืกืืืจ ืื ืืคืจื.
ืืื ืืืื ืชืืชืื ืืืชื ืืื ืฉื ืืื ืืจืืืช ืื ืืคืจืืืจืื ืURL ื ืืื ืื ืืืชืืืืื
ื. ืขืืืื ืื ืืขืืืชื ืืช ืืืฃ,
ื. ืื ื ืื ืื ืืคืจื
ื. ืืื ืกืชื ืืช ื URL ืฉืืืคืืข ืืืืจ ืืคืจืืกื -
@ืข-ื-ืืื-ืข ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?ืืื ืืื ืขืืืื ืืืื ืกืืืจ ืื ืืคืจื.
ืืื ืืืื ืชืืชืื ืืืชื ืืื ืฉื ืืื ืืจืืืช ืื ืืคืจืืืจืื ืURL ื ืืื ืื ืืืชืืืืื
ื. ืขืืืื ืื ืืขืืืชื ืืช ืืืฃ,
ื. ืื ื ืื ืื ืืคืจื
ื. ืืื ืกืชื ืืช ื URL ืฉืืืคืืข ืืืืจ ืืคืจืืกื@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?ืืื ืืื ืขืืืื ืืืื ืกืืืจ ืื ืืคืจื.
ืืื ืืืื ืชืืชืื ืืืชื ืืื ืฉื ืืื ืืจืืืช ืื ืืคืจืืืจืื ืURL ื ืืื ืื ืืืชืืืืื
ื. ืขืืืื ืื ืืขืืืชื ืืช ืืืฃ,
ืื ืืื ืืชื ืืืืข ืฉืืื ืื ืขืืื?
ื. ืื ื ืื ืื ืืคืจื
ืื ื ืื, ืืืื ืื ื ืื ืืืื ืืืืืง ืื.
ื. ืืื ืกืชื ืืช ื URL ืฉืืืคืืข ืืืืจ ืืคืจืืกื
ืืื ืืืกืคืช ืื ืืช ืืคืจืืืจืื ืื ืืจืฉืื?
-
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ืขืืื... ืืฉืืื ืืช ืืืฃ ืฉืฉืืื ืืืื?ืืื ืืื ืขืืืื ืืืื ืกืืืจ ืื ืืคืจื.
ืืื ืืืื ืชืืชืื ืืืชื ืืื ืฉื ืืื ืืจืืืช ืื ืืคืจืืืจืื ืURL ื ืืื ืื ืืืชืืืืื
ื. ืขืืืื ืื ืืขืืืชื ืืช ืืืฃ,
ืื ืืื ืืชื ืืืืข ืฉืืื ืื ืขืืื?
ื. ืื ื ืื ืื ืืคืจื
ืื ื ืื, ืืืื ืื ื ืื ืืืื ืืืืืง ืื.
ื. ืืื ืกืชื ืืช ื URL ืฉืืืคืืข ืืืืจ ืืคืจืืกื
ืืื ืืืกืคืช ืื ืืช ืืคืจืืืจืื ืื ืืจืฉืื?
@ืข-ื-ืืื-ืข
ืื ื ืคืืชื ืืช ืื ืืืคืืคื (ืื ื ืขืืจื ื "ืขืืจื ืืงืกื ") .
ื. ืกืืืื ืขื ืืืืจืืช ืืื ืืื ืืชื ืืชืืืื "ืืคืจืืืจืื ืื ืืจืฉืื"? -
@ืข-ื-ืืื-ืข
ืื ื ืคืืชื ืืช ืื ืืืคืืคื (ืื ื ืขืืจื ื "ืขืืจื ืืงืกื ") .
ื. ืกืืืื ืขื ืืืืจืืช ืืื ืืื ืืชื ืืชืืืื "ืืคืจืืืจืื ืื ืืจืฉืื"?@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ื ืคืืชื ืืช ืื ืืืคืืคื (ืื ื ืขืืจื ื "ืขืืจื ืืงืกื ") .
ื. ืกืืืื ืขื ืืืืจืืช ืืื ืืื ืืชื ืืชืืืื "ืืคืจืืืจืื ืื ืืจืฉืื"?ืืื ืืชื ืื ืกื ืืืคืขืื ืืช ืื?
-
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
@ืข-ื-ืืื-ืข
ืื ื ืคืืชื ืืช ืื ืืืคืืคื (ืื ื ืขืืจื ื "ืขืืจื ืืงืกื ") .
ื. ืกืืืื ืขื ืืืืจืืช ืืื ืืื ืืชื ืืชืืืื "ืืคืจืืืจืื ืื ืืจืฉืื"?ืืื ืืชื ืื ืกื ืืืคืขืื ืืช ืื?
@ืข-ื-ืืื-ืข ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
ืืื ืืชื ืื ืกื ืืืคืขืื ืืช ืื?
ืื ื ืืืฃ ืฉืืจืื ืื ื ืฉืืื.
<!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ืกืงืจ</title> <style> body { font-family: "Alef", sans-serif; background-color: #f5f6fa; direction: rtl; text-align: center; padding: 30px; } h1 { color: #2f3640; } .option { display: block; margin: 10px auto; text-align: right; max-width: 300px; } button { background-color: #40739e; color: white; padding: 10px 20px; border: none; border-radius: 6px; cursor: pointer; font-size: 16px; margin-top: 20px; } button:hover { background-color: #487eb0; } #results { max-width: 500px; margin: 40px auto; } #otherText { display: none; margin-top: 8px; width: 80%; padding: 5px; } </style> </head> <body> <h1>ืฉืืืช ืืกืงืจ</h1> <div id="poll-container"> <form id="poll-form"> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 1"> ืชืฉืืื 1</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 2"> ืชืฉืืื 2</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 3"> ืชืฉืืื 3</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 4"> ืชืฉืืื 4</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 5"> ืชืฉืืื 5</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 6"> ืชืฉืืื 6</label> <label class="option"><input type="radio" name="choice" value="ืืืจ" id="otherOption"> ืืืจ:</label> <input type="text" id="otherText" placeholder="ืืชืื ืชืฉืืืชื..." /> <button type="submit" style="font-size:18px; font-weight:bold; padding:10px 20px;"> ืฉืื ืืฆืืขื<br> <small style="font-size:12px; font-weight:normal;">ืฉืื โฅ๏ธ ืืืืจ ืืฉืืืื ืื ื ืืชื ืืฉื ืืช ืืฆืืขื</small> </button> </form> </div> <div id="results" style="display:none;"> <h2>ืชืืฆืืืช ืืกืงืจ</h2> <canvas id="resultsChart"></canvas> </div> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> const SCRIPT_URL = "URL ืื apps script"; // ืืืืฃ ืืงืืฉืืจ ืึพDeploy ืฉืื const form = document.getElementById("poll-form"); const pollContainer = document.getElementById("poll-container"); const resultsDiv = document.getElementById("results"); const otherOption = document.getElementById("otherOption"); const otherText = document.getElementById("otherText"); document.querySelectorAll('input[name="choice"]').forEach(r => { r.addEventListener('change', () => { otherText.style.display = otherOption.checked ? 'block' : 'none'; }); }); form.addEventListener("submit", async (e) => { e.preventDefault(); const selected = document.querySelector('input[name="choice"]:checked'); if (!selected) return alert("ืื ื ืืืจ ืชืฉืืื"); let answer = selected.value; if (answer === "ืืืจ") { if (!otherText.value.trim()) return alert("ืื ื ืฆืืื ืชืฉืืืชื"); answer = otherText.value.trim(); } try { const res = await fetch(SCRIPT_URL, { method: "POST", body: JSON.stringify({ answer }), headers: { "Content-Type": "application/json" }, }); const data = await res.json(); if (data.status !== "ok") throw new Error(data.message || "ืฉืืืื ืืฉืืืื"); localStorage.setItem("voted", "true"); pollContainer.style.display = "none"; showResults(); } catch (err) { alert("ืืืจืขื ืฉืืืื ืืฉืืืื: " + err.message); } }); async function showResults() { resultsDiv.style.display = "block"; try { const res = await fetch(SCRIPT_URL); const data = await res.json(); const labels = Object.keys(data); const values = Object.values(data); const ctx = document.getElementById("resultsChart").getContext("2d"); new Chart(ctx, { type: "bar", data: { labels, datasets: [{ label: "ืืืืช ืืฆืืขืืช", data: values, backgroundColor: "rgba(64,115,158,0.7)" }] }, options: { responsive: true, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: true } } } }); } catch (err) { alert("ืื ื ืืชื ืืืขืื ืชืืฆืืืช ืืจืืข."); } } if (localStorage.getItem("voted") === "true") { pollContainer.style.display = "none"; showResults(); } </script> </body> </html>
-
@ืข-ื-ืืื-ืข ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
ืืื ืืชื ืื ืกื ืืืคืขืื ืืช ืื?
ืื ื ืืืฃ ืฉืืจืื ืื ื ืฉืืื.
<!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ืกืงืจ</title> <style> body { font-family: "Alef", sans-serif; background-color: #f5f6fa; direction: rtl; text-align: center; padding: 30px; } h1 { color: #2f3640; } .option { display: block; margin: 10px auto; text-align: right; max-width: 300px; } button { background-color: #40739e; color: white; padding: 10px 20px; border: none; border-radius: 6px; cursor: pointer; font-size: 16px; margin-top: 20px; } button:hover { background-color: #487eb0; } #results { max-width: 500px; margin: 40px auto; } #otherText { display: none; margin-top: 8px; width: 80%; padding: 5px; } </style> </head> <body> <h1>ืฉืืืช ืืกืงืจ</h1> <div id="poll-container"> <form id="poll-form"> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 1"> ืชืฉืืื 1</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 2"> ืชืฉืืื 2</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 3"> ืชืฉืืื 3</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 4"> ืชืฉืืื 4</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 5"> ืชืฉืืื 5</label> <label class="option"><input type="radio" name="choice" value="ืชืฉืืื 6"> ืชืฉืืื 6</label> <label class="option"><input type="radio" name="choice" value="ืืืจ" id="otherOption"> ืืืจ:</label> <input type="text" id="otherText" placeholder="ืืชืื ืชืฉืืืชื..." /> <button type="submit" style="font-size:18px; font-weight:bold; padding:10px 20px;"> ืฉืื ืืฆืืขื<br> <small style="font-size:12px; font-weight:normal;">ืฉืื โฅ๏ธ ืืืืจ ืืฉืืืื ืื ื ืืชื ืืฉื ืืช ืืฆืืขื</small> </button> </form> </div> <div id="results" style="display:none;"> <h2>ืชืืฆืืืช ืืกืงืจ</h2> <canvas id="resultsChart"></canvas> </div> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> const SCRIPT_URL = "URL ืื apps script"; // ืืืืฃ ืืงืืฉืืจ ืึพDeploy ืฉืื const form = document.getElementById("poll-form"); const pollContainer = document.getElementById("poll-container"); const resultsDiv = document.getElementById("results"); const otherOption = document.getElementById("otherOption"); const otherText = document.getElementById("otherText"); document.querySelectorAll('input[name="choice"]').forEach(r => { r.addEventListener('change', () => { otherText.style.display = otherOption.checked ? 'block' : 'none'; }); }); form.addEventListener("submit", async (e) => { e.preventDefault(); const selected = document.querySelector('input[name="choice"]:checked'); if (!selected) return alert("ืื ื ืืืจ ืชืฉืืื"); let answer = selected.value; if (answer === "ืืืจ") { if (!otherText.value.trim()) return alert("ืื ื ืฆืืื ืชืฉืืืชื"); answer = otherText.value.trim(); } try { const res = await fetch(SCRIPT_URL, { method: "POST", body: JSON.stringify({ answer }), headers: { "Content-Type": "application/json" }, }); const data = await res.json(); if (data.status !== "ok") throw new Error(data.message || "ืฉืืืื ืืฉืืืื"); localStorage.setItem("voted", "true"); pollContainer.style.display = "none"; showResults(); } catch (err) { alert("ืืืจืขื ืฉืืืื ืืฉืืืื: " + err.message); } }); async function showResults() { resultsDiv.style.display = "block"; try { const res = await fetch(SCRIPT_URL); const data = await res.json(); const labels = Object.keys(data); const values = Object.values(data); const ctx = document.getElementById("resultsChart").getContext("2d"); new Chart(ctx, { type: "bar", data: { labels, datasets: [{ label: "ืืืืช ืืฆืืขืืช", data: values, backgroundColor: "rgba(64,115,158,0.7)" }] }, options: { responsive: true, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: true } } } }); } catch (err) { alert("ืื ื ืืชื ืืืขืื ืชืืฆืืืช ืืจืืข."); } } if (localStorage.getItem("voted") === "true") { pollContainer.style.display = "none"; showResults(); } </script> </body> </html>
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
const SCRIPT_URL = "URL ืื apps script"; // ืืืืฃ ืืงืืฉืืจ ืึพDeploy ืฉืื
ืืฉืืจื ืืื ืืชื ืฆืจืื ืืืื ืืก ืืช ืืงืืฉืืจ ืฉืืื ืชื ืื ืืืจื ืืคืจืืกื ืฉื ืืกืงืจืืคื
-
@ืืชืขื ืืื-ืืืื ืืชื ืืืขืื |
apps script, ืื ืื ื ืืคืกืคืก
๏ธ:
const SCRIPT_URL = "URL ืื apps script"; // ืืืืฃ ืืงืืฉืืจ ืึพDeploy ืฉืื
ืืฉืืจื ืืื ืืชื ืฆืจืื ืืืื ืืก ืืช ืืงืืฉืืจ ืฉืืื ืชื ืื ืืืจื ืืคืจืืกื ืฉื ืืกืงืจืืคื
@ืข-ื-ืืื-ืข ืืืืื, ืืช ืื ืขืฉืืชื...