ืืขืื | ๐ช 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 ืฉืืืืฉืืจื ืืื ืืชื ืฆืจืื ืืืื ืืก ืืช ืืงืืฉืืจ ืฉืืื ืชื ืื ืืืจื ืืคืจืืกื ืฉื ืืกืงืจืืคื
@ืข-ื-ืืื-ืข ืืืืื, ืืช ืื ืขืฉืืชื...
ืฉืืื! ื ืจืื ืฉืืฉืืื ืืื ืืขื ืืื ืช ืืืชื, ืืื ืขืืืื ืืื ืื ืืฉืืื.
ื ืืืก ืืื ืืืืื ืืื ืืืชื ืืคืืกืืื ืืื ืืืงืืจ? ืืฉื ืจืฉืืื ืืืฉืืื, ืชืืื ืชืืืจื ืืืืืง ืืืงืื ืฉืื ืืืืชื ืงืืื, ืืชืืืื ืืืืืจ ืืงืื ืืชืจืืืช ืขื ืชืืืืืช ืืืฉืืช (ืืื ืื ืืืืื, ืืืื ืื ืืืชืจืืช ืคืืฉ). ืชืืืื ืื ืืฉืืืจ ืกืืื ืืืช ืืืคืจืื ื-upvote ืืคืืกืืื ืืื ืืืืืข ืืขืจืื ืืืืจื ืงืืืื ืืืจืื.
ืืขืืจืช ืืชืจืืื ืฉืื, ืืคืืกื ืืื ืืืื ืืืืืช ืืคืืื ืืื ืืืชืจ ๐
ืืจืฉืื ืืชืืืจืืช