דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • בהיר
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • כהה
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
  1. דף הבית
  2. מחשבים וטכנולוגיה
  3. עזרה הדדית - מחשבים וטכנולוגיה
  4. שיתוף | שליחת וקבלת הודעות וואטסאפ פון באינטרנט, בעיצוב זהה לזה של וואטסאפ, פתוח בנטפרי

שיתוף | שליחת וקבלת הודעות וואטסאפ פון באינטרנט, בעיצוב זהה לזה של וואטסאפ, פתוח בנטפרי

מתוזמן נעוץ נעול הועבר עזרה הדדית - מחשבים וטכנולוגיה
136 פוסטים 24 כותבים 954 צפיות 21 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ה החפץ בעילום שם 0

    @DHOC979 לא הבנתי, כשיש צינתוק זה מייד מתריע באפליקציה שיש הודעה חדשה?
    איך הוא יודע שיש הודעה חדשה?
    הוא בודק כל כמה זמן או שזה מיידי

    מ מנותק
    מ מנותק
    מוגן
    כתב נערך לאחרונה על ידי
    #113
    פוסט זה נמחק!
    תגובה 1 תגובה אחרונה
    0
    • D DHOC979

      בהשראת הפרויקט הזה של @פתרון-ai
      פרויקט שפשוט מסנכרן את הקבוצה שלכם למחשב ומאפשר לכם להאזין ולשלוח הודעות כולל צינתוקים חינמיים לרשימה הרשומה.
      מבחינה בטיחותית האתר לא מחובר לשום שרת וממילא הכל נשמר במחשב שלך.

      מעבר למערכת
      אפליקציה

      לאלה שמשתמשים באנשי הקשר: בטבלת השיטס חובה להפוך את טורים A B D ל"טקסט רגיל" ככה: לבחור את הטור, להיכנס ל"עיצוב" > "מספר" > "טקסט רגיל" במקום "אוטומטי".
      אפשר להשתמש באנשי הקשר עם הסקריפט הזה

      לאלה המעוניינים לשתף קישור ללא הפרטים של המערכת

      בהכנסת הפרטים הראשונה יש מדריך מפורט שלב שלב מה בדיוק לעשות - פשוט מאד
      בכל מקרה מביא הוראות בספוילר:

      הוראות שימוש:
      בתיבת הטוקן יש להכניס את מספר המערכת והסיסמה בצורה כזו: 0771234567:123456.
      במספר שלוחה יש להשאיר על מספר 1 שזוהי שלוחת השמעת ההקלטות.
      בתיבה הבאה של "שליחת צינתוק " יש להכניס את שם רשימת הצינתוקים כפי שמופיע בניהול ימות המשיח.
      בתיבה הרביעית לכאו' אפשר להשאיר ריק / לפעול על פי ההוראות במידה ורלוונטי.
      בתיבה החמישית אפשר לייצר טבלת שיטס ולחבר אותה עם כתובת API של https://sheetdb.io למערכת, וכך לאפשר רשימת אנשי קשר משותפת לכלל חברי הקבוצה שלכם. פרטים בקלוד.

      צילום:
      123.PNG

      מ מנותק
      מ מנותק
      מוגן
      כתב נערך לאחרונה על ידי
      #114

      @DHOC979
      עשיתי לפי ההוראות ועדיין אני מקבל הודעות שגיאה
      6753a79d-754f-4193-beb9-426481562f24-image.jpeg
      בעת נסיון להוסיף אנשי קשר
      כמו כן האנשי קשר לא נטענים.

      תגובה 1 תגובה אחרונה
      0
      • ה הדיבל המעופף

        @לנציצ כתב:

        תכלס‌​‌‌​‌​​​​​‌ לא הבנתי
        אם אני מוציא טוקן שמאפשר גישה מאוד מצומצמת
        איך אני מפעיל איתה את המערכת??
        זה מספיק??

        מה הכוונה מספיק? לפעולות אלו זה מספיק

        ל מנותק
        ל מנותק
        לנציצ
        כתב נערך לאחרונה על ידי
        #115

        @הדיבל-המעופף השאלה‌​‌‌​‌​​​​​‌ היא האם התוכנה הזאת תפעל כראוי עם הרשאות האלה
        ואיפה שמים את הטוקן ??
        כמו הסיסמה הרגילה??
        אחרי הנקודתיים??

        תגובה 1 תגובה אחרונה
        0
        • ה החפץ בעילום שם 0

          @DHOC979 לא הבנתי, כשיש צינתוק זה מייד מתריע באפליקציה שיש הודעה חדשה?
          איך הוא יודע שיש הודעה חדשה?
          הוא בודק כל כמה זמן או שזה מיידי

          D מחובר
          D מחובר
          DHOC979
          כתב נערך לאחרונה על ידי
          #116

          @החפץ-בעילום-שם-0 כתב:

          @DHOC979 לא הבנתי, כשיש צינתוק זה מייד מתריע באפליקציה שיש הודעה חדשה?
          איך הוא יודע שיש הודעה חדשה?
          הוא בודק כל כמה זמן או שזה מיידי

          מיד כשתקבל צינתוק ההודעה מופיעה על המסך עם צליל, וברגע שתשלח הודעה מהאתר ישלח צינתוק למערכת. זה ממש כמו הטלפון רק במחשב.

          תגובה 1 תגובה אחרונה
          0
          • D מחובר
            D מחובר
            DHOC979
            כתב נערך לאחרונה על ידי
            #117

            פתרון פנטסטי לאלה שלא רוצים לפרסם את פרטי המנהל:
            תוכלו לייצר קישור בקידוד מיוחד שיפענח את פרטי המערכת שלכם בלי להציג אף אחד מהפרטים!
            אדגיש שלעת עתה הפתרון הוא למי שרוצה לשלוח קישור לאיש הפשוט ולא למפתח, כי כן אפשר לפענח את הפרטים בצורות כלשהם וד"ל
            איך זה עובד: כנסו לאתר, הקליקו על ההגדרות בצד שמאל של הבלוק, למטה יופיע כפתור "העתק קישור" פשוט לוחצים וזה מעתיק את הקישור, מה שנותר לכם זה לשתף אותו עם חברים.

            מי שרוצה לעזור בשיפור בפיצ'ר לרמת אבטחה גבוהה יותר אשמח, באישי

            (קרדיט לרעיון @שלמה גולד )

            מ ל 2 תגובות תגובה אחרונה
            0
            • D DHOC979

              פתרון פנטסטי לאלה שלא רוצים לפרסם את פרטי המנהל:
              תוכלו לייצר קישור בקידוד מיוחד שיפענח את פרטי המערכת שלכם בלי להציג אף אחד מהפרטים!
              אדגיש שלעת עתה הפתרון הוא למי שרוצה לשלוח קישור לאיש הפשוט ולא למפתח, כי כן אפשר לפענח את הפרטים בצורות כלשהם וד"ל
              איך זה עובד: כנסו לאתר, הקליקו על ההגדרות בצד שמאל של הבלוק, למטה יופיע כפתור "העתק קישור" פשוט לוחצים וזה מעתיק את הקישור, מה שנותר לכם זה לשתף אותו עם חברים.

              מי שרוצה לעזור בשיפור בפיצ'ר לרמת אבטחה גבוהה יותר אשמח, באישי

              (קרדיט לרעיון @שלמה גולד )

              מ מנותק
              מ מנותק
              מוגן
              כתב נערך לאחרונה על ידי
              #118

              @DHOC979 מה עם זה?
              https://mitmachim.top/topic/99969/שיתוף-שליחת-וקבלת-הודעות-וואטסאפ-פון-באינטרנט-בעיצוב-זהה-לזה-של-וואטסאפ-פתוח-בנטפרי/114

              D תגובה 1 תגובה אחרונה
              0
              • מ מוגן

                @DHOC979 מה עם זה?
                https://mitmachim.top/topic/99969/שיתוף-שליחת-וקבלת-הודעות-וואטסאפ-פון-באינטרנט-בעיצוב-זהה-לזה-של-וואטסאפ-פתוח-בנטפרי/114

                D מחובר
                D מחובר
                DHOC979
                כתב נערך לאחרונה על ידי
                #119

                @מוגן יתכן שזה קשור לטורים בטבלת השיטס. אתה צריך להגדיר את טורים A B D כטקסט רגיל.
                תבחר את הטור, תקליק על "מעצב" > "מספר" > במקום "אוטומטי" תגדיר "טקסט רגיל".

                מ תגובה 1 תגובה אחרונה
                0
                • D DHOC979

                  @מוגן יתכן שזה קשור לטורים בטבלת השיטס. אתה צריך להגדיר את טורים A B D כטקסט רגיל.
                  תבחר את הטור, תקליק על "מעצב" > "מספר" > במקום "אוטומטי" תגדיר "טקסט רגיל".

                  מ מנותק
                  מ מנותק
                  מוגן
                  כתב נערך לאחרונה על ידי
                  #120

                  @DHOC979 הגדרתי!
                  אגב איך הסדר מספר ואז שם פרטי ואז משפחה או ההפך?

                  D תגובה 1 תגובה אחרונה
                  0
                  • מ מוגן

                    @DHOC979 הגדרתי!
                    אגב איך הסדר מספר ואז שם פרטי ואז משפחה או ההפך?

                    D מחובר
                    D מחובר
                    DHOC979
                    כתב נערך לאחרונה על ידי DHOC979
                    #121

                    @מוגן הטורים צריכים להיראות בדיוק כך:
                    טור A כך: SystemKey
                    טור B כך: ContactId
                    טור C כך: Name
                    טור D כך: Phone
                    טור E כך: PhotoUrl
                    טור F כך: UpdatedAt
                    בדיוק באלה השמות ובזה הסדר.
                    אם זה לא עזר תשלח לי את הקונסול שאבין מה בדיוק הבעיה.

                    מ תגובה 1 תגובה אחרונה
                    0
                    • D מחובר
                      D מחובר
                      DHOC979
                      כתב נערך לאחרונה על ידי
                      #122

                      אם יש ביקוש אעלה פה סקריפט שיהיה אפשר להפעיל את אנשי הקשר ישירות מהשיטס ללא צורך בשירות החיצוני של sheetdb.io

                      תגובה 1 תגובה אחרונה
                      1
                      • D DHOC979

                        פתרון פנטסטי לאלה שלא רוצים לפרסם את פרטי המנהל:
                        תוכלו לייצר קישור בקידוד מיוחד שיפענח את פרטי המערכת שלכם בלי להציג אף אחד מהפרטים!
                        אדגיש שלעת עתה הפתרון הוא למי שרוצה לשלוח קישור לאיש הפשוט ולא למפתח, כי כן אפשר לפענח את הפרטים בצורות כלשהם וד"ל
                        איך זה עובד: כנסו לאתר, הקליקו על ההגדרות בצד שמאל של הבלוק, למטה יופיע כפתור "העתק קישור" פשוט לוחצים וזה מעתיק את הקישור, מה שנותר לכם זה לשתף אותו עם חברים.

                        מי שרוצה לעזור בשיפור בפיצ'ר לרמת אבטחה גבוהה יותר אשמח, באישי

                        (קרדיט לרעיון @שלמה גולד )

                        ל מנותק
                        ל מנותק
                        לנציצ
                        כתב נערך לאחרונה על ידי
                        #123

                        @DHOC979 אפשר אולי צילום מסך
                        לא מצאתי את הנושא המדובר??
                        ואגב

                        לנציצ כתב:

                        @dhoc979 השאלה‌​‌‌​‌​​​​​‌ היא האם התוכנה הזאת תפעל כראוי עם הרשאות האלה
                        ואיפה שמים את הטוקן ??
                        כמו הסיסמה הרגילה??

                        תגובה 1 תגובה אחרונה
                        0
                        • D DHOC979

                          @מוגן הטורים צריכים להיראות בדיוק כך:
                          טור A כך: SystemKey
                          טור B כך: ContactId
                          טור C כך: Name
                          טור D כך: Phone
                          טור E כך: PhotoUrl
                          טור F כך: UpdatedAt
                          בדיוק באלה השמות ובזה הסדר.
                          אם זה לא עזר תשלח לי את הקונסול שאבין מה בדיוק הבעיה.

                          מ מנותק
                          מ מנותק
                          מוגן
                          כתב נערך לאחרונה על ידי
                          #124

                          @DHOC979 לא עוזר
                          חייבים למלאות את כל הפרטים?
                          מילאתי בטור C שם ובטור D מספר טלפון והוא לא מזהה כלום וגם לא מוכן להוסיף אנשי קשר מתוך ההקלטות.

                          D תגובה 1 תגובה אחרונה
                          0
                          • מ מוגן

                            @DHOC979 לא עוזר
                            חייבים למלאות את כל הפרטים?
                            מילאתי בטור C שם ובטור D מספר טלפון והוא לא מזהה כלום וגם לא מוכן להוסיף אנשי קשר מתוך ההקלטות.

                            D מחובר
                            D מחובר
                            DHOC979
                            כתב נערך לאחרונה על ידי
                            #125

                            @מוגן שלח לי באישי צילומסך של הטבלה שלך
                            ואם אתה יכול אז גם את שגיאות הקונסול בכלי הפיתוח (f12)

                            תגובה 1 תגובה אחרונה
                            1
                            • D מחובר
                              D מחובר
                              DHOC979
                              כתב נערך לאחרונה על ידי DHOC979
                              #126

                              סקריפט:

                              /**
                               * 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();
                                }
                              }
                              
                              
                              מ תגובה 1 תגובה אחרונה
                              0
                              • D DHOC979

                                סקריפט:

                                /**
                                 * 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();
                                  }
                                }
                                
                                
                                מ מנותק
                                מ מנותק
                                מוגן
                                כתב נערך לאחרונה על ידי
                                #127

                                @DHOC979 איפה שמים בדיוק את הסקריפט הזה?

                                D תגובה 1 תגובה אחרונה
                                0
                                • מ מוגן

                                  @DHOC979 איפה שמים בדיוק את הסקריפט הזה?

                                  D מחובר
                                  D מחובר
                                  DHOC979
                                  כתב נערך לאחרונה על ידי
                                  #128

                                  @מוגן אתה נכנס לטבלה בשיטס, לוחץ על תוספים, אפסקרפיט, ואז אתה מכניס את הקוד, שומר, לוחץ פריסה, פריסה חדשה, מאשר גישה, מעתיק את כתובת הURL הכחולה ומכניס אותה בתיבה הייעודית באתר הוואטסאפון

                                  א 2 תגובות תגובה אחרונה
                                  0
                                  • D DHOC979

                                    @מוגן אתה נכנס לטבלה בשיטס, לוחץ על תוספים, אפסקרפיט, ואז אתה מכניס את הקוד, שומר, לוחץ פריסה, פריסה חדשה, מאשר גישה, מעתיק את כתובת הURL הכחולה ומכניס אותה בתיבה הייעודית באתר הוואטסאפון

                                    א מחובר
                                    א מחובר
                                    אאA
                                    כתב נערך לאחרונה על ידי
                                    #129

                                    @DHOC979
                                    זה מה שעשיתי ובשמירה כותב שיש שגיאה בשמירה

                                    D תגובה 1 תגובה אחרונה
                                    0
                                    • D DHOC979

                                      @מוגן אתה נכנס לטבלה בשיטס, לוחץ על תוספים, אפסקרפיט, ואז אתה מכניס את הקוד, שומר, לוחץ פריסה, פריסה חדשה, מאשר גישה, מעתיק את כתובת הURL הכחולה ומכניס אותה בתיבה הייעודית באתר הוואטסאפון

                                      א מחובר
                                      א מחובר
                                      אאA
                                      כתב נערך לאחרונה על ידי
                                      #130

                                      @DHOC979
                                      cb6fc205-63ec-4a37-aac3-93f11fd83e5e-image.jpeg

                                      תגובה 1 תגובה אחרונה
                                      0
                                      • א אאA

                                        @DHOC979
                                        זה מה שעשיתי ובשמירה כותב שיש שגיאה בשמירה

                                        D מחובר
                                        D מחובר
                                        DHOC979
                                        כתב נערך לאחרונה על ידי
                                        #131

                                        @אאA אני רואה, יתכן נטפרי אבל אני בודק ותכף אעדכן.

                                        א 3 תגובות תגובה אחרונה
                                        1
                                        • D DHOC979

                                          @אאA אני רואה, יתכן נטפרי אבל אני בודק ותכף אעדכן.

                                          א מחובר
                                          א מחובר
                                          אאA
                                          כתב נערך לאחרונה על ידי
                                          #132

                                          @DHOC979
                                          זו לא אמורה להיות בעיה של נטפרי.
                                          אלו דברים שאני עושה הרבה

                                          S תגובה 1 תגובה אחרונה
                                          0

                                          שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

                                          נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

                                          בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                                          הרשמה התחברות

                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • חוקי הפורום
                                          • פופולרי
                                          • לא נפתר
                                          • משתמשים
                                          • חיפוש גוגל בפורום
                                          • צור קשר