בעיה | 😪 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); } }
נ.ב. זה אחד מתוך רבים...
-
@ע-ה-דכו-ע
לא עובד... לשלוח את הדף ששולח אליו? -
@ע-ה-דכו-ע
לא עובד... לשלוח את הדף ששולח אליו?@מתעניין-בהכל כתב בבעיה |
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 שלך
בשורה הזו אתה צריך להכניס את הקישור שיינתן לך אחרי הפריסה של הסקריפט
@ע-ה-דכו-ע כמובן, את זה עשיתי...
-
@ע-ה-דכו-ע כמובן, את זה עשיתי...
@מתעניין-בהכל כתב בבעיה |
apps script, מה אני מפספס
️:
@ע-ה-דכו-ע כמובן, את זה עשיתי...
חשבתי שכתבת שעדיין לא פרסת את הסקריפט, עכשיו אני מבין שרק את הHTML
הבעיה בדף שהוא לא שולח שום טוקן, למרות שבסקריפט מוגדר בדיקה של טוקן יייחודי.
-
@מתעניין-בהכל כתב בבעיה |
apps script, מה אני מפספס
️:
@ע-ה-דכו-ע כמובן, את זה עשיתי...
חשבתי שכתבת שעדיין לא פרסת את הסקריפט, עכשיו אני מבין שרק את הHTML
הבעיה בדף שהוא לא שולח שום טוקן, למרות שבסקריפט מוגדר בדיקה של טוקן יייחודי.
@ע-ה-דכו-ע כתב בבעיה |
apps script, מה אני מפספס
️:
@מתעניין-בהכל כתב בבעיה |
apps script, מה אני מפספס
️:
@ע-ה-דכו-ע כמובן, את זה עשיתי...
חשבתי שכתבת שעדיין לא פרסת את הסקריפט, עכשיו אני מבין שרק את הHTML
הבעיה בדף שהוא לא שולח שום טוקן, למרות שבסקריפט מוגדר בדיקה של טוקן יייחודי.
גם הסקריפטים שלא היה בהם בקשה של טוקן לא עבדו.