Sheets איך לקבל התראות על שינויים בגוגל שיטס?

  • הוסף לסימניות
  • #1
שינויים בטווח תאים מסוים
בעדיפות על הודעה אחת על שינויים כל עוד לא נצפו הקודמים, בדומה להודעות של פרוג "יתכן וישנן תגובות נוספות לאחר מכן..."
 
  • הוסף לסימניות
  • #2
אפשר בבקשה יותר פרטים? מה הכוונה בטווח תאים מסוים?
 
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #3
האופציה המובנית בגוגל שיטס היא שעל כל שינוי שנעשה בגליון נשלחת הודעה
אני רוצה לקבל הודעה רק על שינוי שנעשה בתאים מסויימים, לדוג': A5 : D9
 
  • הוסף לסימניות
  • #4
אפשר לעשות את זה עם גוגל סקריפט
צריך להעתיק את התוכן של התאים המסוימים למקום אחר ואז להריץ קוד שיבדוק אם זה תואם, אם זה לא תואם זה ישלח הודעה.
אגב מה הכוונה הודעה, למייל?
 
נערך לאחרונה ב:
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #5
כן, הודעה למייל

יותר מסובך ממה שחשבתי
אאלץ לוותר על זה
 
  • הוסף לסימניות
  • #6
אפשר גם אוטומציה
 
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #7
יש איפה לעשות את זה באופן חינמי באוטומציה?
ניסיתי בזפייר ומייק אבל נראה לי שיש הגבלת הודעות, נכון?
יש מערכת אחרת חינמית ?
 
  • הוסף לסימניות
  • #8
יש איפה לעשות את זה באופן חינמי באוטומציה?
ניסיתי בזפייר ומייק אבל נראה לי שיש הגבלת הודעות, נכון?
יש מערכת אחרת חינמית ?
אני מכירה מייק אבל זה לא עולה יקר
ויכול להיות מאוד שהתוכנית החינמית תספיק לך
 
  • הוסף לסימניות
  • #9
בגוגל סקריפט זה ממש לא מסובך,

שאלתי את gemini וזה מה שהוא ענה:
שלום, יש לי גליון בגוגל שיטס ואני רוצה לקבל עדכון למייל במידה ותאים בטווח מסוים משתנים, אני רוצה שבשינוי הראשון זה ישלח עדכון למייל ואחר כך אם קורים שינויים נוספים זה לא ישלח כלום אלא אם כן כבר םתחתי את הגליון וראיתי את השינויים
AI
היי, בהחלט אפשר להגדיר התראות מייל בגוגל שיטס שיעבדו כמו שאתה מתאר. זה קצת יותר מורכב מההתראות המובנות, אבל אפשר לעשות זאת באמצעות סקריפט Google Apps Script. הנה איך זה עובד ואיך להגדיר את זה:
עקרון הפעולה:
  1. סקריפט מופעל על שינוי: הסקריפט ירוץ בכל פעם שמתבצע שינוי בגליון האלקטרוני.
  2. בדיקה אם השינוי הוא בטווח הרלוונטי: הסקריפט יבדוק האם השינוי בוצע בטווח התאים שאתה מעוניין לעקוב אחריו.
  3. בדיקה האם נשלח כבר מייל: הסקריפט ישמור ערך (לדוגמא, בגיליון נסתר) שיציין האם כבר נשלח מייל על שינוי, על מנת למנוע שליחת מייל כפול.
  4. שליחת מייל: אם השינוי בטווח הרלוונטי, ולא נשלח עדיין מייל, הסקריפט ישלח מייל.
  5. איפוס סטטוס שליחת המייל: כאשר אתה פותח את הגיליון, הסקריפט יאפס את הסטטוס, כך שבשינוי הבא תוכל לקבל התראה שוב.
הגדרת הסקריפט:
  1. פתיחת עורך הסקריפטים:
    • בגיליון גוגל שלך, לחץ על "הרחבות" (Extensions) ואז על "Apps Script".
  2. העתקת הקוד: העתק את הקוד הבא לעורך הסקריפטים:
JavaScript:
function onEdit(e) {
  // הגדרות
  const WATCH_RANGE = 'A1:B10';  // טווח התאים שאחריהם עוקבים
  const EMAIL_ADDRESS = '<לא ניתן לפרסם מיילים באופן פומבי>'; // כתובת המייל שלך
  const SHEET_NAME = 'Sheet1';  // שם הגיליון
  const FLAG_SHEET_NAME = 'Flags'; // שם הגיליון שיכיל את הדגל
  const FLAG_CELL = 'A1'; // התא בגיליון הדגל שבו נשמר סטטוס המייל
  const EMAIL_SUBJECT = 'שינוי בוצע בגיליון!';
  const EMAIL_BODY = 'שינוי בוצע בגיליון שלך בטווח: ' + WATCH_RANGE;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  const flagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);


  //בדיקה האם גליון הדגל קיים, ואם לא, ליצור אותו
  if (!flagsSheet) {
    ss.insertSheet(FLAG_SHEET_NAME);
    const newFlagsSheet = ss.getSheetByName(FLAG_SHEET_NAME)
    newFlagsSheet.getRange(FLAG_CELL).setValue(false);
  }
   
  const range = e.range;

  // בדיקה אם השינוי בוצע בטווח הרלוונטי
  if (sheet.getName() == SHEET_NAME && range.getSheet().getName() == SHEET_NAME && range.isPartOf(sheet.getRange(WATCH_RANGE))) {
   
    // קריאה לסטטוס שליחת המייל
    const emailSent = flagsSheet.getRange(FLAG_CELL).getValue();


    //אם המייל לא נשלח עדיין
    if (!emailSent) {
          //שליחת מייל
          MailApp.sendEmail({
            to: EMAIL_ADDRESS,
            subject: EMAIL_SUBJECT,
            body: EMAIL_BODY
          });
          //עדכון דגל שנשלח מייל
          flagsSheet.getRange(FLAG_CELL).setValue(true);
    }

  }
}

function onOpen() {
  // הגדרות
  const FLAG_SHEET_NAME = 'Flags'; // שם הגיליון שיכיל את הדגל
  const FLAG_CELL = 'A1'; // התא בגיליון הדגל שבו נשמר סטטוס המייל

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const flagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);

  //איפוס הדגל
    if (flagsSheet) {
      flagsSheet.getRange(FLAG_CELL).setValue(false);
    }
}

  1. התאמת ההגדרות:
    • שנה את WATCH_RANGE לטווח התאים שאתה רוצה לעקוב אחריהם (למשל: "A1:C5").
    • שנה את EMAIL_ADDRESS לכתובת המייל שלך.
    • שנה את SHEET_NAME לשם הגיליון שבו השינויים מתרחשים, אם הוא שונה מ-Sheet1.
    • שנה את FLAG_SHEET_NAME לשם הגליון שבו ישמר הדגל, או השאר כברירת מחדל.
    • שנה את EMAIL_SUBJECT ואת EMAIL_BODY אם תרצה.
  2. שמירת הסקריפט: לחץ על הסמל של הדיסקט לשמירה.
  3. מתן הרשאות: בפעם הראשונה שתריץ את הסקריפט, גוגל תבקש הרשאות. עקוב אחר ההנחיות על המסך כדי לאשר את ההרשאות הנדרשות.
  4. הגדרת טריגר (trigger) אוטומטי:
    • לחץ על סמל השעון (Triggers) בעורך הסקריפט.
    • לחץ על "Add Trigger" בתחתית החלון.
    • בחר את הפונקציה onEdit
    • בחר "From spreadsheet" באופציה "Events" ובאופציה "Select event type" בחר "On edit"
    • לחץ על "Save".
    • חזור על הפעולה ובחר את הפונקציה onOpen, באופציה "Events" בחר "From spreadsheet" ובאופציה "Select event type" בחר "On open"
הסבר על הקוד:
  • onEdit(e): הפונקציה הזו רצה בכל פעם שמתבצע שינוי בגליון.
  • onOpen(): הפונקציה הזו רצה בכל פעם שפותחים את הגליון, ומאפסת את סטטוס שליחת המייל.
  • WATCH_RANGE: מגדיר את טווח התאים שאחריהם עוקבים.
  • EMAIL_ADDRESS: מגדיר את כתובת המייל שאליה תישלח ההתראה.
  • sheet.getRange(WATCH_RANGE): מחזיר את טווח התאים המוגדר.
  • range.isPartOf(): בודק אם השינוי בוצע בתוך טווח המעקב.
  • MailApp.sendEmail(): שולח את המייל.
  • הקוד משתמש בגיליון נסתר בשם Flags על מנת לנהל את הסטטוס של שליחת המייל, כך שבפעם הבאה שאתה פותח את הגיליון, הערך הזה מתאפס.
  • SpreadsheetApp.getActiveSpreadsheet() מקבל את הגיליון הנוכחי.
שימוש:
  1. בצע שינוי בטווח התאים שציינת (WATCH_RANGE).
  2. אם זה השינוי הראשון מאז שפתחת את הגיליון, תקבל מייל התראה.
  3. אם תבצע שינויים נוספים באותו טווח, לא תקבל מיילים נוספים עד שתסגור ותפתח שוב את הגיליון.
הערות חשובות:
  • ודא שכתובת המייל שהזנת נכונה.
  • הגדרת ההתראות עובדת על בסיס משתמש. כלומר, כל משתמש שמבצע שינוי בגיליון יגרום לשליחת מייל למשתמש שהגדיר את הסקריפט.
  • אם יש לך הרבה משתמשים שמשנים את הגיליון, ייתכן שתצטרך לנהל את הדגל הזה בצורה מורכבת יותר.
  • יש מגבלות על כמות המיילים שגוגל מאפשרת לשלוח ביום באמצעות סקריפטים.
  • הסקריפט מניח שאתה משתמש בגליון אחד. אם יש לך מספר גיליונות, תצטרך להתאים את הקוד.
אני מקווה שההסבר הזה יעזור לך. אם יש לך שאלות נוספות, אל תהסס לשאול!
[כרגע אני בחדר מחשבים כך שחסום לי גוגל סקריפט אז לא יכולתי לבדוק אם זה עובד בפועל, אבל ממה שעברתי על הקוד מלמעלה זה נראה טוב].
 
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #10
תודה רבה על המענה!

זה מראה לי על השורה הזו שלא תקין:
const range = e.range;
 
  • הוסף לסימניות
  • #12
יש בשיטס אפשרות של התראות מותנות.
עם תנאים וכללים.
קל מאוד
הבעיה שזה לא מופיע לכולם עדיין - זה די חדש.
1737015590710.png
 
  • הוסף לסימניות
  • #14
הנה הקוד המתוקן לפונקציית onEdit:
JavaScript:
function onEdit(e) {
  // הגדרות
  const WATCH_RANGE = 'A1:B10';  // טווח התאים שאחריהם עוקבים
  const EMAIL_ADDRESS = '<לא ניתן לפרסם מיילים באופן פומבי>'; // כתובת המייל שלך
  const SHEET_NAME = 'Sheet1';  // שם הגיליון
  const FLAG_SHEET_NAME = 'Flags'; // שם הגיליון שיכיל את הדגל
  const FLAG_CELL = 'A1'; // התא בגיליון הדגל שבו נשמר סטטוס המייל
  const EMAIL_SUBJECT = 'שינוי בוצע בגיליון!';
  const EMAIL_BODY = 'שינוי בוצע בגיליון שלך בטווח: ' + WATCH_RANGE;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  const flagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);

  // בדיקה אם הטריגר נשלח עם אובייקט e נכון
  if (!e || !e.range) {
    Logger.log('No event data available.');
    return;  // אם אין אובייקט e, יוצאים מהפונקציה
  }
  Logger.log('Event data is valid.');

  // בדיקה האם גליון הדגל קיים, ואם לא, ליצור אותו
  if (!flagsSheet) {
    Logger.log('No flags sheet found, creating a new one.');
    ss.insertSheet(FLAG_SHEET_NAME);
    const newFlagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);
    newFlagsSheet.getRange(FLAG_CELL).setValue(false);
  } else {
    Logger.log('Flags sheet found.');
  }

  const range = e.range;

  // בדיקה אם ה-range שייך לגיליון הרצוי
  if (range.getSheet() && range.getSheet().getName() == SHEET_NAME) {
    Logger.log('Edit made in the correct sheet: ' + SHEET_NAME);
   
    // בדיקה אם השינוי בוצע בטווח הרלוונטי
    const watchRange = sheet.getRange(WATCH_RANGE);
    const watchStartRow = watchRange.getRow();
    const watchStartCol = watchRange.getColumn();
    const watchEndRow = watchStartRow + watchRange.getNumRows() - 1;
    const watchEndCol = watchStartCol + watchRange.getNumColumns() - 1;

    const editedRow = range.getRow();
    const editedCol = range.getColumn();

    Logger.log('Edited Row: ' + editedRow + ', Edited Column: ' + editedCol);
    Logger.log('Watch Range - Start Row: ' + watchStartRow + ', Start Col: ' + watchStartCol);
    Logger.log('Watch Range - End Row: ' + watchEndRow + ', End Col: ' + watchEndCol);

    // בדיקה אם התא שהשתנה נמצא בתוך טווח המעקב
    if (editedRow >= watchStartRow && editedRow <= watchEndRow &&
        editedCol >= watchStartCol && editedCol <= watchEndCol) {
      Logger.log('Edit is within the watch range: ' + WATCH_RANGE);

      // קריאה לסטטוס שליחת המייל
      const emailSent = flagsSheet.getRange(FLAG_CELL).getValue();
      Logger.log('Email sent status: ' + emailSent);

      // אם המייל לא נשלח עדיין
      if (!emailSent) {
        Logger.log("Sending email...");
       
        // שליחת מייל
        MailApp.sendEmail({
          to: EMAIL_ADDRESS,
          subject: EMAIL_SUBJECT,
          body: EMAIL_BODY
        });
       
        Logger.log("Email sent successfully.");

        // עדכון דגל שנשלח מייל
        flagsSheet.getRange(FLAG_CELL).setValue(true);
        Logger.log('Flag updated to true (email sent).');
      } else {
        Logger.log('Email already sent, skipping email sending.');
      }
    } else {
      Logger.log('Edit is not within the watch range.');
    }
  } else {
    Logger.log('Edit was made in a different sheet, not ' + SHEET_NAME);
  }
}
בדקתי וזה עובד!
את פונקציית onOpen יש להשאיר כמקודם
רק שינוי קטן, יש להוסיף טריגר שיפעיל את הפונקציה onEdit בעת עריכת הגליון.
‏‏לכידה.PNG
 
נערך לאחרונה ב:
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #15
במקום להגדיר את כתובת המייל אפשר להגדיר גם כך
קוד:
const EMAIL_ADDRESS = Session.getActiveUser().getEmail();
זה מקבל אוטומטי את כתובת המייל של המשתמש הנוכחי בגליון שביצע את העריכה
 
  • הוסף לסימניות
  • #16
הנה הקוד המתוקן לפונקציית onEdit:
JavaScript:
function onEdit(e) {
  // הגדרות
  const WATCH_RANGE = 'A1:B10';  // טווח התאים שאחריהם עוקבים
  const EMAIL_ADDRESS = '<לא ניתן לפרסם מיילים באופן פומבי>'; // כתובת המייל שלך
  const SHEET_NAME = 'Sheet1';  // שם הגיליון
  const FLAG_SHEET_NAME = 'Flags'; // שם הגיליון שיכיל את הדגל
  const FLAG_CELL = 'A1'; // התא בגיליון הדגל שבו נשמר סטטוס המייל
  const EMAIL_SUBJECT = 'שינוי בוצע בגיליון!';
  const EMAIL_BODY = 'שינוי בוצע בגיליון שלך בטווח: ' + WATCH_RANGE;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  const flagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);

  // בדיקה אם הטריגר נשלח עם אובייקט e נכון
  if (!e || !e.range) {
    Logger.log('No event data available.');
    return;  // אם אין אובייקט e, יוצאים מהפונקציה
  }
  Logger.log('Event data is valid.');

  // בדיקה האם גליון הדגל קיים, ואם לא, ליצור אותו
  if (!flagsSheet) {
    Logger.log('No flags sheet found, creating a new one.');
    ss.insertSheet(FLAG_SHEET_NAME);
    const newFlagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);
    newFlagsSheet.getRange(FLAG_CELL).setValue(false);
  } else {
    Logger.log('Flags sheet found.');
  }

  const range = e.range;

  // בדיקה אם ה-range שייך לגיליון הרצוי
  if (range.getSheet() && range.getSheet().getName() == SHEET_NAME) {
    Logger.log('Edit made in the correct sheet: ' + SHEET_NAME);
  
    // בדיקה אם השינוי בוצע בטווח הרלוונטי
    const watchRange = sheet.getRange(WATCH_RANGE);
    const watchStartRow = watchRange.getRow();
    const watchStartCol = watchRange.getColumn();
    const watchEndRow = watchStartRow + watchRange.getNumRows() - 1;
    const watchEndCol = watchStartCol + watchRange.getNumColumns() - 1;

    const editedRow = range.getRow();
    const editedCol = range.getColumn();

    Logger.log('Edited Row: ' + editedRow + ', Edited Column: ' + editedCol);
    Logger.log('Watch Range - Start Row: ' + watchStartRow + ', Start Col: ' + watchStartCol);
    Logger.log('Watch Range - End Row: ' + watchEndRow + ', End Col: ' + watchEndCol);

    // בדיקה אם התא שהשתנה נמצא בתוך טווח המעקב
    if (editedRow >= watchStartRow && editedRow <= watchEndRow &&
        editedCol >= watchStartCol && editedCol <= watchEndCol) {
      Logger.log('Edit is within the watch range: ' + WATCH_RANGE);

      // קריאה לסטטוס שליחת המייל
      const emailSent = flagsSheet.getRange(FLAG_CELL).getValue();
      Logger.log('Email sent status: ' + emailSent);

      // אם המייל לא נשלח עדיין
      if (!emailSent) {
        Logger.log("Sending email...");
      
        // שליחת מייל
        MailApp.sendEmail({
          to: EMAIL_ADDRESS,
          subject: EMAIL_SUBJECT,
          body: EMAIL_BODY
        });
      
        Logger.log("Email sent successfully.");

        // עדכון דגל שנשלח מייל
        flagsSheet.getRange(FLAG_CELL).setValue(true);
        Logger.log('Flag updated to true (email sent).');
      } else {
        Logger.log('Email already sent, skipping email sending.');
      }
    } else {
      Logger.log('Edit is not within the watch range.');
    }
  } else {
    Logger.log('Edit was made in a different sheet, not ' + SHEET_NAME);
  }
}
בדקתי וזה עובד!
את פונקציית onOpen יש להשאיר כמקודם
רק שינוי קטן, יש להוסיף טריגר שיפעיל את הפונקציה onEdit בעת עריכת הגליון.
זה לא שולח מייל
רואים שמשהו קורה, נפתח גליון חדש FLAGS, ורושם FALSE

כמה טריגרים אמור להיות?
אחד ONOPEN- בעת פתיחה
ואחד ONEDIT- בעת עריכה ?
 
  • הוסף לסימניות
  • #17
לא, מספיק הטריגר של העריכה
אם זה לא עובד אפשר לבדוק בכרטיסיה "הפעלות" [מתחת הכרטיסיה של "מפעילים"].
לערוך את הגליון בטווח המדובר, ואז לראות בכרטיסיה הפעלות אם זה הופעל או לא והאם זה הצליח או נכשל, וכן לקרוא את הלוגים.
אם תעלו את הלוגים לפה יהיה אפשר לראות איפה זה נתקע
 
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #18
וואו, עובד!
תודה ענקית לכל מי שעזר

אולי עוד 2 דברים קטנים(?!)
אם אני רוצה את אותו דבר בטורים שונים ובכל טור ישלח הודעה למייל אחר, מעתיקים שוב את הקוד עם הפרטים האחרים אחרי הקוד הנוכחי?
ולהוסיף בהודעת המייל קישור לגליון זה משהו מסובך?
 
  • הוסף לסימניות
  • #19
להוסיף קישור לגליון זה קלי קלות
שינוי קטן בהגדרת הראשונות של פונקציית העריכה:
קוד:
  const URL_SHEET = "https://docs.google.com/spreadsheets/d/" + SpreadsheetApp.getActiveSpreadsheet().getId()
  const EMAIL_BODY = 'שינוי בוצע בגיליון שלך בטווח: ' + WATCH_RANGE + "\n קישור לגליון: " + URL_SHEET ;

[הוספת שורה של URL, ועדכון השורה של תוכן המייל]
לא בדקתי בפועל אבל לכאורה אמור לעבוד
אם רוצים הודעות נפרדות לטורים שונים צריך להגדיר 2 טווחים ולעשות תנאים, אולי אנסה לעבוד על זה בהמשך.
אפשר גם להעתיק את כל הפונקציה בשלמותה, [ולשנות לה שם כמובן, כדי שלא יהיו 2 פונקציות באותו שם], ולהגדיר טווח אחר ומייל אחר. וכמובן להגדיר גם לה טריגר בעת עריכה.
 
נערך לאחרונה ב:
  • תודה
Reactions: chh
  • הוסף לסימניות
  • #20
קוד מעודכן ל2 טווחים:
[תשובה מג'מיני]
בטח, הנה הקוד המעודכן שמאפשר הגדרת שני טווחים ושליחת מיילים שונים בהתאם:

JavaScript:
function onEdit(e) {
  // הגדרות
  const WATCH_RANGES = {
    'A1:B10': { // טווח 1
      email: '<כתובת_מייל_1>', // כתובת מייל עבור טווח 1
      email_subject: 'שינוי בוצע בגיליון - טווח 1', // נושא מייל עבור טווח 1
      email_body: 'שינוי בוצע בגיליון שלך בטווח: A1:B10' // גוף מייל עבור טווח 1
    },
     'C1:D10': { // טווח 2
      email: '<כתובת_מייל_2>', // כתובת מייל עבור טווח 2
      email_subject: 'שינוי בוצע בגיליון - טווח 2', // נושא מייל עבור טווח 2
      email_body: 'שינוי בוצע בגיליון שלך בטווח: C1:D10'  // גוף מייל עבור טווח 2
    }
  };

  const SHEET_NAME = 'Sheet1';  // שם הגיליון
  const FLAG_SHEET_NAME = 'Flags'; // שם הגיליון שיכיל את הדגל
  const FLAG_CELL_PREFIX = 'A'; // תחילית התאים בגיליון הדגל שבהם נשמר סטטוס המייל
 

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName(SHEET_NAME);
  let flagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);

  // בדיקה אם הטריגר נשלח עם אובייקט e נכון
  if (!e || !e.range) {
    Logger.log('No event data available.');
    return;  // אם אין אובייקט e, יוצאים מהפונקציה
  }
  Logger.log('Event data is valid.');

  // בדיקה האם גליון הדגל קיים, ואם לא, ליצור אותו
  if (!flagsSheet) {
    Logger.log('No flags sheet found, creating a new one.');
    ss.insertSheet(FLAG_SHEET_NAME);
    flagsSheet = ss.getSheetByName(FLAG_SHEET_NAME);
  } else {
    Logger.log('Flags sheet found.');
  }

  const range = e.range;

  // בדיקה אם ה-range שייך לגיליון הרצוי
  if (range.getSheet() && range.getSheet().getName() == SHEET_NAME) {
    Logger.log('Edit made in the correct sheet: ' + SHEET_NAME);

    // מעבר על כל הטווחים המוגדרים
    for (const watchRangeStr in WATCH_RANGES) {
      const watchRange = sheet.getRange(watchRangeStr);
      const watchStartRow = watchRange.getRow();
      const watchStartCol = watchRange.getColumn();
      const watchEndRow = watchStartRow + watchRange.getNumRows() - 1;
      const watchEndCol = watchStartCol + watchRange.getNumColumns() - 1;

      const editedRow = range.getRow();
      const editedCol = range.getColumn();
      
      Logger.log('Checking range: ' + watchRangeStr);
      Logger.log('Edited Row: ' + editedRow + ', Edited Column: ' + editedCol);
      Logger.log('Watch Range - Start Row: ' + watchStartRow + ', Start Col: ' + watchStartCol);
      Logger.log('Watch Range - End Row: ' + watchEndRow + ', End Col: ' + watchEndCol);


      // בדיקה אם התא שהשתנה נמצא בתוך טווח המעקב הנוכחי
      if (editedRow >= watchStartRow && editedRow <= watchEndRow &&
        editedCol >= watchStartCol && editedCol <= watchEndCol) {
        Logger.log('Edit is within the watch range: ' + watchRangeStr);

        // יצירת תא הדגל עבור טווח זה
         const rangeIndex = Object.keys(WATCH_RANGES).indexOf(watchRangeStr); // יצירת אינדקס
        const flagCell = `${FLAG_CELL_PREFIX}${rangeIndex + 1}`;
        
        // אם תא הדגל לא קיים, יש ליצור אותו ולהגדיר לו ערך ראשוני
        if (!flagsSheet.getRange(flagCell).getValue()) {
          flagsSheet.getRange(flagCell).setValue(false);
        }
          // קריאה לסטטוס שליחת המייל
        const emailSent = flagsSheet.getRange(flagCell).getValue();
        Logger.log('Email sent status for ' + watchRangeStr + ': ' + emailSent);


        // אם המייל לא נשלח עדיין
        if (!emailSent) {
            Logger.log("Sending email for range: " + watchRangeStr);
            const emailDetails = WATCH_RANGES[watchRangeStr];
          // שליחת מייל
          MailApp.sendEmail({
            to: emailDetails.email,
            subject: emailDetails.email_subject,
            body: emailDetails.email_body
          });

          Logger.log("Email sent successfully for range: " + watchRangeStr);

          // עדכון דגל שנשלח מייל
          flagsSheet.getRange(flagCell).setValue(true);
          Logger.log('Flag updated to true (email sent) for range: ' + watchRangeStr);
        } else {
            Logger.log('Email already sent for range ' + watchRangeStr + ', skipping email sending.');
        }
      } else {
         Logger.log('Edit is not within the watch range: ' + watchRangeStr);
      }
    }
  } else {
    Logger.log('Edit was made in a different sheet, not ' + SHEET_NAME);
  }
}
```

**שינויים עיקריים:**

1. **`WATCH_RANGES`**:
* הגדרנו אובייקט `WATCH_RANGES` המכיל את טווחי המעקב כמפתחות.
* כל טווח מוגדר כאובייקט עם המאפיינים: `email`, `email_subject`, `email_body`, המאפשרים הגדרת הגדרות מייל שונות לכל טווח.
2. **לולאה על טווחי המעקב**:
* הוספנו לולאה שעוברת על כל הטווחי המוגדרים ב- `WATCH_RANGES`.
* הלולאה בודקת אם השינוי בוצע בטווח הנוכחי
3. **תאי דגל מרובים**:
* במקום תא דגל יחיד, עכשיו לכל טווח יש תא דגל משלו.
* תאי הדגל נקראים A1, A2, A3 וכו׳, בהתאם למספר הטווח.
4. **קוד מפורט יותר**: הוספנו לוגים מפורטים יותר כדי שיהיה קל להבין מה קורה.

**איך להשתמש:**

1. **הגדרות:** שנה את `WATCH_RANGES` כך שיכיל את הטווחי מעקב שלך ואת כתובות המייל, הנושא והתוכן המתאימים. שים לב, שכל טווח צריך להיות בפורמט מחרוזת כמו 'A1:B10'.
2. **העתקת הקוד**: העתק את הקוד המעודכן לסקריפט האפליקציה שלך.
3. **הרצה:** ברגע שביצעת שינוי בגיליון בטווחים שהגדרת, המייל יישלח לכתובת הרלוונטית.
4. **גיליון הדגל:** הקוד ייצור גיליון בשם "Flags" אם הוא לא קיים.
5. **הרשאות**: וודא שיש לקוד הרשאות לשלוח מיילים, תוכל לבדוק זאת על ידי הרצת הפונקציה באופן ידני בפעם הראשונה.

**הערות:**

* וודא שיש לך הרשאות לשלוח מיילים מהחשבון שלך.
* אתה יכול להוסיף עוד טווחים ל- `WATCH_RANGES` לפי הצורך.
* תוכל להתאים אישית את גוף המייל והנושא עבור כל טווח.

אני מקווה שהקוד הזה יעזור לך. אם יש לך שאלות נוספות, אל תהסס לשאול!

לא בדקתי עדיין בפועל אבל במבט מלמעלה נראה לי טוב.
 
  • תודה
Reactions: chh

פרוגבוט

תוכן שיווקי
פרסומת

פוסטים חדשים שאולי לא קראת....

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

להפוך בית שלם 100+ מטר של ארונות כיורים שולחנות מטבח סלון כיסאות מזווה מיטות
לכשר לפסח
לאפשרות שאתם וילדכם הסתובבו בחופשיות עם מצה ואפיקומן שסבא קנה
לא נכנסתי להוצאות המטורפות שקצת עוברות לידכם. למה שתקנו מצות יין או חסה או נייר כסף לציפוי המטבח
ושוב לא בהאשמה ולא בטרוניה אלא כנתון מציאותי
אז זו''צ יקר קצת שימת לב
לפרגן לבוא לעזור חצי יום
לפרגן ארוחה לעובדים בבית [הבית שלך חמץ המטבח שלהם במרפסת שרות]
לתת מילה טובה או שוקולד
והחשוב מכל
מעשרות להורים
הם חשובים יותר מכל כולל ארגון או קמחה דפסחא הם ההורים שלך

והם יממנו לך את ארוחות וסעודות החג
בס"ד

ההבדל בין נוכלות לבין כישלון



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

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

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

צרות אחרונות משכחות את הראשונות וכך שכחתי מזה לגמרי, אלא שהשבוע פורסמה כתבה בעיתון 'דה-מרקר' (מי שלא מכיר לא הפסיד - מלא באהבת כסף ושנאת חרדים) כתבת תחקיר עומק אודות תופעת העוקצים בציבור החרדי הכרוכים במבצעי 10/90 הזכורים לשימצה.

מה שלא אהבתי זה ההתמקדות במתווך חרדי מסוים כאילו הוא שורש הרע בעולם כולו ואיך מלאו ליבו כביכול, ומעשה שהיה כך הווה בעשרות עותקים ברחבי הארץ שרובם מוכרים לי היטיב:

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

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

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

ואיך הדלפון שלנו יממן את מה שעשירי טבריה מתקשים?

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

אז איפה הקצ'?

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

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

אך עשרת הקוראים כאן יודעים שעד כאן הייתה רק ההקדמה, כעת נתחיל עם הניתוח הכואב של הנתונים ואת הצד של לימוד זכות:

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

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

אז מה קרה בכל הפרוייקטים הכושלים?

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

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

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

המחיר פשוט לא עלה, ולפעמים אפילו ירד.

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

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

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

לא בהרבה, אך מספיקה ירידה של 8% כדי שכל העסק יהפוך להפסד.

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

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

אז להפסיק להשקיע בנדל"ן?

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

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



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

הרקע וההתפרצות (סוף דצמבר 2025):

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


הטבח והחשכת המידע (ינואר 2026):
  • דיכוי אלים: המשטר האיראני הגיב באכזריות יוצאת דופן. לפי נתוני ארגון זכויות האדם HRANA, נכון ל-23 בינואר, מספר ההרוגים המאומת עומד על למעלה מ-5,000 בני אדם, בהם 4,716 מפגינים ועשרות ילדים.
    יש דיווחים לא מאומתים מצד האופוזיציה האיראנית על מעל 60,000 הרוגים!

  • מעצרים המוניים: למעלה מ-26,500 בני אדם נעצרו, וקיים חשש כבד להוצאות להורג המוניות בבתי הכלא.

  • חסימת אינטרנט: החל מה-8 בינואר הוטל מצור דיגיטלי כמעט מוחלט על המדינה כדי למנוע זליגת תיעודים מהטבח.

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


הזווית הישראלית והאזורית:
  • כוננות שיא: ישראל נמצאת בדריכות עליונה מחשש שהסלמה אמריקנית תוביל לתגובה איראנית ישירה או באמצעות שלוחיה (פרוקסי).

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

  • איומי טהראן: המשטר האיראני הודיע כי במקרה של תקיפה, בסיסים אמריקניים ויעדים בישראל יהיו "מטרות לגיטימיות".

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

יש 4 גופי כשרות
  • בד"ץ העדה החרדית - על פי פסקי הרב יעקב בלוי זצ"ל שהיה בקיא גדול בתחום שוק ההון והוא שהביא את פסקיו ועל פי פסקים אלו נוהגים עד היום בגוף כשרות זה. היום הכשרות בראשות הרב שלמה זאב קרליבך.
  • גלאט הון - על פי פסקי רבי ניסים קרליץ והרב שמואל ואזנר. שסמכו ידיהם על הרב יעקב לנדו שמכיר את שוק ההון לעומקו. הרב משה שטרנבוך ראב"ד העדה החרדית הוא מרבני 'גלאט הון'.
  • תשואה כהלכה – הרב שמואל דוד גרוס, רב חסידי גור אשדוד ועוד רבנים מוכרים וידועים בכל שכבות הציבור החרדי.
  • כלכלה על פי ההלכה- הרב אריה דביר, על פי פסקי הרב יוסף שלום אלישיב.

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

רשימות קרנות כשרות:

הצטרפות לניוזלטר

איזה כיף שהצטרפתם לניוזלטר שלנו!

מעכשיו, תהיו הראשונים לקבל את כל העדכונים, החדשות, ההפתעות בלעדיות, והתכנים הכי חמים שלנו בפרוג!

לוח מודעות

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק כה

אלְדָוִד אֵלֶיךָ יי נַפְשִׁי אֶשָּׂא:באֱלֹהַי בְּךָ בָטַחְתִּי אַל אֵבוֹשָׁה אַל יַעַלְצוּ אֹיְבַי לִי:גגַּם כָּל קוֶֹיךָ לֹא יֵבֹשׁוּ יֵבֹשׁוּ הַבּוֹגְדִים רֵיקָם:דדְּרָכֶיךָ יי הוֹדִיעֵנִי אֹרְחוֹתֶיךָ לַמְּדֵנִי:ההַדְרִיכֵנִי בַאֲמִתֶּךָ וְלַמְּדֵנִי כִּי אַתָּה אֱלֹהֵי יִשְׁעִי אוֹתְךָ קִוִּיתִי כָּל הַיּוֹם:וזְכֹר רַחֲמֶיךָ יי וַחֲסָדֶיךָ כִּי מֵעוֹלָם הֵמָּה:זחַטֹּאות נְעוּרַי וּפְשָׁעַי אַל תִּזְכֹּר כְּחַסְדְּךָ זְכָר לִי אַתָּה לְמַעַן טוּבְךָ יי:חטוֹב וְיָשָׁר יי עַל כֵּן יוֹרֶה חַטָּאִים בַּדָּרֶךְ:טיַדְרֵךְ עֲנָוִים בַּמִּשְׁפָּט וִילַמֵּד עֲנָוִים דַּרְכּוֹ:יכָּל אָרְחוֹת יי חֶסֶד וֶאֱמֶת לְנֹצְרֵי בְרִיתוֹ וְעֵדֹתָיו:יאלְמַעַן שִׁמְךָ יי וְסָלַחְתָּ לַעֲוֹנִי כִּי רַב הוּא:יבמִי זֶה הָאִישׁ יְרֵא יי יוֹרֶנּוּ בְּדֶרֶךְ יִבְחָר:יגנַפְשׁוֹ בְּטוֹב תָּלִין וְזַרְעוֹ יִירַשׁ אָרֶץ:ידסוֹד יי לִירֵאָיו וּבְרִיתוֹ לְהוֹדִיעָם:טועֵינַי תָּמִיד אֶל יי כִּי הוּא יוֹצִיא מֵרֶשֶׁת רַגְלָי:טזפְּנֵה אֵלַי וְחָנֵּנִי כִּי יָחִיד וְעָנִי אָנִי:יזצָרוֹת לְבָבִי הִרְחִיבוּ מִמְּצוּקוֹתַי הוֹצִיאֵנִי:יחרְאֵה עָנְיִי וַעֲמָלִי וְשָׂא לְכָל חַטֹּאותָי:יטרְאֵה אוֹיְבַי כִּי רָבּוּ וְשִׂנְאַת חָמָס שְׂנֵאוּנִי:כשָׁמְרָה נַפְשִׁי וְהַצִּילֵנִי אַל אֵבוֹשׁ כִּי חָסִיתִי בָךְ:כאתֹּם וָיֹשֶׁר יִצְּרוּנִי כִּי קִוִּיתִיךָ:כבפְּדֵה אֱלֹהִים אֶת יִשְׂרָאֵל מִכֹּל צָרוֹתָיו:
נקרא  2  פעמים
למעלה