שיתוף | שליחת וקבלת הודעות וואטסאפ פון באינטרנט, בעיצוב זהה לזה של וואטסאפ, פתוח בנטפרי
-
@DHOC979 לא הבנתי, כשיש צינתוק זה מייד מתריע באפליקציה שיש הודעה חדשה?
איך הוא יודע שיש הודעה חדשה?
הוא בודק כל כמה זמן או שזה מיידי@DHOC979 לא הבנתי, כשיש צינתוק זה מייד מתריע באפליקציה שיש הודעה חדשה?
איך הוא יודע שיש הודעה חדשה?
הוא בודק כל כמה זמן או שזה מיידימיד כשתקבל צינתוק ההודעה מופיעה על המסך עם צליל, וברגע שתשלח הודעה מהאתר ישלח צינתוק למערכת. זה ממש כמו הטלפון רק במחשב.
-
פתרון פנטסטי לאלה שלא רוצים לפרסם את פרטי המנהל:
תוכלו לייצר קישור בקידוד מיוחד שיפענח את פרטי המערכת שלכם בלי להציג אף אחד מהפרטים!
אדגיש שלעת עתה הפתרון הוא למי שרוצה לשלוח קישור לאיש הפשוט ולא למפתח, כי כן אפשר לפענח את הפרטים בצורות כלשהם וד"ל
איך זה עובד: כנסו לאתר, הקליקו על ההגדרות בצד שמאל של הבלוק, למטה יופיע כפתור "העתק קישור" פשוט לוחצים וזה מעתיק את הקישור, מה שנותר לכם זה לשתף אותו עם חברים.מי שרוצה לעזור בשיפור בפיצ'ר לרמת אבטחה גבוהה יותר אשמח, באישי
(קרדיט לרעיון @שלמה גולד )
-
פתרון פנטסטי לאלה שלא רוצים לפרסם את פרטי המנהל:
תוכלו לייצר קישור בקידוד מיוחד שיפענח את פרטי המערכת שלכם בלי להציג אף אחד מהפרטים!
אדגיש שלעת עתה הפתרון הוא למי שרוצה לשלוח קישור לאיש הפשוט ולא למפתח, כי כן אפשר לפענח את הפרטים בצורות כלשהם וד"ל
איך זה עובד: כנסו לאתר, הקליקו על ההגדרות בצד שמאל של הבלוק, למטה יופיע כפתור "העתק קישור" פשוט לוחצים וזה מעתיק את הקישור, מה שנותר לכם זה לשתף אותו עם חברים.מי שרוצה לעזור בשיפור בפיצ'ר לרמת אבטחה גבוהה יותר אשמח, באישי
(קרדיט לרעיון @שלמה גולד )
-
-
@מוגן יתכן שזה קשור לטורים בטבלת השיטס. אתה צריך להגדיר את טורים A B D כטקסט רגיל.
תבחר את הטור, תקליק על "מעצב" > "מספר" > במקום "אוטומטי" תגדיר "טקסט רגיל". -
אם יש ביקוש אעלה פה סקריפט שיהיה אפשר להפעיל את אנשי הקשר ישירות מהשיטס ללא צורך בשירות החיצוני של sheetdb.io
-
פתרון פנטסטי לאלה שלא רוצים לפרסם את פרטי המנהל:
תוכלו לייצר קישור בקידוד מיוחד שיפענח את פרטי המערכת שלכם בלי להציג אף אחד מהפרטים!
אדגיש שלעת עתה הפתרון הוא למי שרוצה לשלוח קישור לאיש הפשוט ולא למפתח, כי כן אפשר לפענח את הפרטים בצורות כלשהם וד"ל
איך זה עובד: כנסו לאתר, הקליקו על ההגדרות בצד שמאל של הבלוק, למטה יופיע כפתור "העתק קישור" פשוט לוחצים וזה מעתיק את הקישור, מה שנותר לכם זה לשתף אותו עם חברים.מי שרוצה לעזור בשיפור בפיצ'ר לרמת אבטחה גבוהה יותר אשמח, באישי
(קרדיט לרעיון @שלמה גולד )
-
@מוגן הטורים צריכים להיראות בדיוק כך:
טור A כך: SystemKey
טור B כך: ContactId
טור C כך: Name
טור D כך: Phone
טור E כך: PhotoUrl
טור F כך: UpdatedAt
בדיוק באלה השמות ובזה הסדר.
אם זה לא עזר תשלח לי את הקונסול שאבין מה בדיוק הבעיה. -
@DHOC979 לא עוזר
חייבים למלאות את כל הפרטים?
מילאתי בטור C שם ובטור D מספר טלפון והוא לא מזהה כלום וגם לא מוכן להוסיף אנשי קשר מתוך ההקלטות. -
סקריפט:
/** * contacts-appsscript.gs * ---------------------- * סקריפט Google Apps Script המשמש כתחליף עצמאי ל-SheetDB עבור אתר ההקלטות (Xnet): * קורא וכותב ישירות לגיליון Google Sheets שהוא מותקן עליו, בלי תלות בשירות חיצוני. * * === התקנה === * 1. בגיליון Google Sheets (חדש או קיים), ודאו ששורת הכותרות הראשונה של הטאב הרלוונטי * (ר' SHEET_NAME למטה) היא בדיוק: * SystemKey | ContactId | Name | Phone | PhotoUrl | UpdatedAt * 2. בתפריט הגיליון: Extensions ← Apps Script. * 3. מוחקים את כל הקוד הקיים בקובץ Code.gs, ומדביקים במקומו את כל התוכן של הקובץ הזה. * 4. שומרים (Ctrl+S). * 5. Deploy ← New deployment ← בוחרים סוג (גלגל שיניים) "Web app". * - Execute as: Me * - Who has access: Anyone * ואז "Deploy". * 6. מעתיקים את הכתובת (URL) שמתקבלת - היא מסתיימת ב-/exec - ומדביקים אותה באתר, * בשדה "כתובת API לאנשי קשר", כשמקור אנשי הקשר מוגדר ל"סקריפט Google Sheets עצמאי". * * === הערת אבטחה === * בדיוק כמו ב-SheetDB, כל מי שמכיר את כתובת ה-Web App הזו (וטוקן מערכת תקין) יכול * לקרוא ולכתוב לשורות ששייכות לאותו טוקן. זה אותה רמת הגנה כמו שהייתה קודם ולא פחות * ולא יותר - אין כאן אימות משתמשים אמיתי. אם עדכנתם קוד זה בעצמכם, שימו לב לא לפרסם * את כתובת ה-Web App במקום גלוי. * * אם תרצו לעדכן את הקוד בעתיד (Deploy מחדש): כדי שכתובת ה-/exec הקיימת תמשיך לעבוד, * יש לבחור ב-Deploy ← Manage deployments ← לערוך (עיפרון) את הפריסה הקיימת ולבחור * "New version", ולא ליצור פריסה (deployment) חדשה - אחרת תקבלו כתובת חדשה ותצטרכו * לעדכן אותה מחדש בהגדרות האתר. */ // שם הטאב (הגיליון הפנימי) בתוך קובץ ה-Sheets שבו נמצאת טבלת אנשי הקשר. // אם הטאב אצלכם נקרא אחרת - עדכנו כאן בהתאם. var SHEET_NAME = 'Sheet1'; var COLUMNS = ['SystemKey', 'ContactId', 'Name', 'Phone', 'PhotoUrl', 'UpdatedAt']; function getSheet_() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(SHEET_NAME); if (!sheet) { throw new Error('לא נמצא גיליון (טאב) בשם "' + SHEET_NAME + '". עדכנו את SHEET_NAME בקוד.'); } return sheet; } // קורא את כל השורות בגיליון ומחזיר אותן כמערך אובייקטים, כולל מספר השורה בפועל // (_row) - נדרש כדי שאפשר יהיה לעדכן/למחוק שורה ספציפית בהמשך. function readAllRows_(sheet) { var values = sheet.getDataRange().getValues(); if (values.length < 2) return []; var header = values[0]; var idx = {}; COLUMNS.forEach(function (c) { idx[c] = header.indexOf(c); }); var rows = []; for (var r = 1; r < values.length; r++) { var row = values[r]; var systemKey = idx.SystemKey > -1 ? row[idx.SystemKey] : ''; var contactId = idx.ContactId > -1 ? row[idx.ContactId] : ''; if (!systemKey && !contactId) continue; // שורה ריקה - מדלגים rows.push({ _row: r + 1, // מספר שורה בגיליון עצמו (1-based, כולל שורת הכותרות) SystemKey: systemKey, ContactId: contactId, Name: idx.Name > -1 ? row[idx.Name] : '', Phone: idx.Phone > -1 ? row[idx.Phone] : '', PhotoUrl: idx.PhotoUrl > -1 ? row[idx.PhotoUrl] : '', UpdatedAt: idx.UpdatedAt > -1 ? row[idx.UpdatedAt] : '' }); } return rows; } function jsonOut_(obj) { return ContentService .createTextOutput(JSON.stringify(obj)) .setMimeType(ContentService.MimeType.JSON); } // GET - קריאה בלבד: מחזיר את כל שורות אנשי הקשר (כולל שורות שיוך הקלטה, ContactId // שמתחיל ב-"rec:") ששייכות ל-SystemKey הנתון. זו הפעולה היחידה שנתמכת דרך GET, // בדיוק כמו /search ב-SheetDB. function doGet(e) { var action = (e && e.parameter && e.parameter.action) || 'search'; var systemKey = (e && e.parameter && e.parameter.SystemKey) || ''; if (action !== 'search' || !systemKey) { return jsonOut_([]); } var sheet = getSheet_(); var rows = readAllRows_(sheet).filter(function (r) { return String(r.SystemKey) === String(systemKey); }); var out = rows.map(function (r) { return { SystemKey: r.SystemKey, ContactId: r.ContactId, Name: r.Name, Phone: r.Phone, PhotoUrl: r.PhotoUrl, UpdatedAt: r.UpdatedAt }; }); return jsonOut_(out); } // POST - כתיבה: מקבל גוף בפורמט JSON בצורה { action: 'upsert' | 'delete', row: {...} }. // חובה ששדות SystemKey ו-ContactId יהיו קיימים ב-row (הם המפתח הזוגי שמזהה שורה). // שימו לב: גוף הבקשה נשלח מהאתר עם Content-Type: text/plain (כדי להימנע מ-CORS // preflight) - זה בסדר גמור, עדיין מפענחים אותו כ-JSON רגיל. function doPost(e) { var body; try { body = JSON.parse(e.postData.contents); } catch (err) { return jsonOut_({ ok: false, error: 'invalid JSON body' }); } var action = body.action; var row = body.row || {}; if (!row.SystemKey || !row.ContactId) { return jsonOut_({ ok: false, error: 'missing SystemKey/ContactId' }); } // ננעל למשך הפעולה כדי למנוע התנגשות בין שתי בקשות כתיבה שמגיעות במקביל // (למשל שני חברי קבוצה ששומרים איש קשר באותו רגע). var lock = LockService.getScriptLock(); lock.waitLock(10000); try { var sheet = getSheet_(); var rows = readAllRows_(sheet); var existing = null; for (var i = 0; i < rows.length; i++) { if (String(rows[i].SystemKey) === String(row.SystemKey) && String(rows[i].ContactId) === String(row.ContactId)) { existing = rows[i]; break; } } if (action === 'delete') { if (existing) sheet.deleteRow(existing._row); return jsonOut_({ ok: true }); } if (action === 'upsert') { var values = [ row.SystemKey, row.ContactId, row.Name || '', row.Phone || '', row.PhotoUrl || '', row.UpdatedAt || new Date().toISOString() ]; if (existing) { sheet.getRange(existing._row, 1, 1, COLUMNS.length).setValues([values]); } else { sheet.appendRow(values); } return jsonOut_({ ok: true }); } return jsonOut_({ ok: false, error: 'unknown action: ' + action }); } finally { lock.releaseLock(); } } ```kotlin
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות