חיבור לידים ל-Google Sheets (חיבור ישיר)

כל ליד חדש נכתב אוטומטית כשורה בגיליון Google Sheets, תוך שניות. סקריפט קטן של Google Apps Script בגיליון, וטריגר עם פעולת Webhook ב-TASKEY. בלי Make, בלי Zapier ובלי מנוי.

החיבור בנוי משני חלקים:

  • בגיליון יושב סקריפט קטן של Google Apps Script. הוא מקבל נתונים ומוסיף שורה.
  • ב-TASKEY טריגר עם פעולת Webhook שולח לסקריפט את פרטי הליד בכל פעם שהטריגר רץ.
מה צריךלמה
חשבון Googleהגיליון והסקריפט יושבים בחשבון שלכם
הרשאת טריגרים ב-TASKEYכדי לבנות את הטריגר. ראו צוותים, תפקידים והרשאות

מתי לבחור בשיטה הזו? כשצריך רק גיליון, בזמן אמת ובלי מנוי. צריכים לחבר גם מערכות אחרות, כמו Mailchimp או Slack? ראו חיבור Make.com ל-TASKEY.

1. מכינים גיליון וסקריפט (ב-Google)

  1. פתחו גיליון Google Sheets חדש (הקלידו sheets.new בדפדפן) או גיליון קיים.
  2. בתפריט לחצו Extensions → Apps Script (בעברית: הרחבות → Apps Script).
  3. מחקו את הקוד לדוגמה והדביקו במקומו את כל הקוד שלמטה. אפשר גם להוריד אותו כקובץ.
  4. לחצו על סמל השמירה.

הורדת קובץ הסקריפט (taskey_google_sheets.gs)

// שם הטאב בגיליון (ייווצר אוטומטית אם לא קיים)
var SHEET_NAME = 'Leads';

function doPost(e) {
  try {
    var data = {};
    if (e && e.postData && e.postData.contents) {
      data = JSON.parse(e.postData.contents);
    } else if (e && e.parameter) {
      data = e.parameter;
    }
    appendRowFromObject(data);
    return jsonOut({ ok: true });
  } catch (err) {
    return jsonOut({ ok: false, error: String(err) });
  }
}

function doGet() {
  return jsonOut({ ok: true, message: 'TASKEY endpoint active' });
}

function appendRowFromObject(data) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(SHEET_NAME) || ss.insertSheet(SHEET_NAME);
  var flat = flattenObject(data);
  flat['_received_at'] = new Date();

  var lock = LockService.getScriptLock();
  lock.waitLock(30000);
  try {
    var lastCol = sheet.getLastColumn();
    var headers = lastCol > 0 ? sheet.getRange(1, 1, 1, lastCol).getValues()[0] : [];
    var updatedHeaders = headers.slice();
    Object.keys(flat).forEach(function (k) {
      if (updatedHeaders.indexOf(k) === -1) updatedHeaders.push(k);
    });
    if (headers.length === 0 || updatedHeaders.length !== headers.length) {
      sheet.getRange(1, 1, 1, updatedHeaders.length).setValues([updatedHeaders]);
      sheet.getRange(1, 1, 1, updatedHeaders.length).setFontWeight('bold');
      sheet.setFrozenRows(1);
      headers = updatedHeaders;
    }
    var row = headers.map(function (h) {
      var v = flat[h];
      return (v === undefined || v === null) ? '' : v;
    });
    sheet.appendRow(row);
  } finally {
    lock.releaseLock();
  }
}

function flattenObject(obj, prefix) {
  prefix = prefix || '';
  var out = {};
  if (obj === null || typeof obj !== 'object') { out[prefix || 'value'] = obj; return out; }
  for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;
    var val = obj[key];
    var name = prefix ? prefix + '.' + key : key;
    if (Array.isArray(val)) { out[name] = JSON.stringify(val); }
    else if (val && typeof val === 'object') {
      var nested = flattenObject(val, name);
      for (var nk in nested) out[nk] = nested[nk];
    } else { out[name] = val; }
  }
  return out;
}

function jsonOut(obj) {
  return ContentService.createTextOutput(JSON.stringify(obj))
    .setMimeType(ContentService.MimeType.JSON);
}

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

2. מפרסמים את הסקריפט כ-Web App (ב-Google)

  1. ב-Apps Script לחצו Deploy → New deployment (פריסה → פריסה חדשה).
  2. ליד Select type בחרו Web app.
  3. ב-Execute as בחרו Me (החשבון שלכם).
  4. ב-Who has access בחרו Anyone. בלי זה TASKEY לא יוכל לכתוב לגיליון.
  5. לחצו Deploy. בפעם הראשונה Google מבקש לאשר הרשאות: אשרו (Allow).
  6. העתיקו את ה-Web app URL. זו כתובת שמסתיימת ב-‎/exec.

הכתובת היא כמו סיסמה. כל מי שיש לו את כתובת ה-‎/exec יכול להוסיף שורות לגיליון (לקרוא אותו הוא לא יכול). אל תפרסמו אותה ואל תשלחו אותה בקבוצות.

שיניתם את הקוד אחרי הפריסה? השינוי לא נכנס לתוקף עד שמפרסמים גרסה חדשה: Deploy → Manage deployments, עריכה (סמל העיפרון), ב-Version בוחרים New version ולוחצים Deploy. הכתובת נשארת אותה כתובת.

3. יוצרים טריגר ב-TASKEY

  1. פתחו הגדרות → טריגרים ולחצו הוספת טריגר חדש.
  2. בשלב סוג ההפעלה בחרו ליד מ-API (חדש או חוזר) ולחצו המשך.

אשף הוספת טריגר: סוג ההפעלה ליד מ-API

  1. בשלב הגדרות בחרו את הטבלה לידים ולחצו המשך.
  2. בשלב שם וסיכום תנו שם, למשל "Google Sheets: כל ליד חדש לגיליון", ולחצו שמור טריגר.

ליד מ-API רץ על כל ליד שמגיע מטופס באתר, מפייסבוק, מ-Make או מכל חיבור אחר, גם על ליד חוזר. רוצים בגיליון משהו אחר? בוחרים סוג הפעלה אחר:

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

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

4. מוסיפים פעולת Webhook

  1. הטריגר החדש מופיע בראש דף הטריגרים, תחת לידים מ-API. לחצו על + בכרטיס שלו.

כרטיס הטריגר החדש: הכפתור + מוסיף פעולה

  1. בשלב סוג פעולה בחרו Webhook. החלון עובר לבד לשלב הגדרות הפעולה.

חלון הוספת פעולה: סוג הפעולה Webhook

  1. ב-כתובת URL הדביקו את כתובת ה-Web App מסעיף 2, זו שמסתיימת ב-‎/exec.
  2. ב-שיטת שליחה השאירו POST (JSON), ברירת המחדל. את כותרות HTTP מותאמות (אופציונלי) השאירו ריק: הסקריפט לא צריך אותן.

הגדרות הפעולה: כתובת ה-Web App ושיטת השליחה POST (JSON)

  1. ב-פורמט Payload בחרו תבנית מותאמת (JSON) ועברו ללשונית JSON מתקדם.
  2. מחקו את מה שבתיבה והדביקו את התבנית:
{
  "שם": "{{full_name}}",
  "טלפון": "{{phone}}",
  "אימייל": "{{email}}",
  "סטטוס": "{{status_name}}",
  "מקור הגעה": "{{Created_BY}}",
  "קמפיין": "{{source}}",
  "מזהה ליד": "{{lead_id}}"
}
  1. ודאו שמתחת לתיבה מופיע JSON תקין.

התבנית בלשונית JSON מתקדם, ומתחתיה JSON תקין

  1. לחצו שמור שינויים פעם אחת. הכפתור מתחלף ל"נשמר בהצלחה". סגרו את החלון בסגור.
  2. הדף מתרענן לבד. בכרטיס הטריגר מופיעה עכשיו פעולת Webhook אחת.

כרטיס הטריגר אחרי השמירה: פעולת Webhook אחת

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

מה נכנס לכל עמודה

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

עמודה בגיליוןמשתנהמה נכנס
שם{{full_name}}שם פרטי ושם משפחה
טלפון{{phone}}הטלפון מכרטיס הליד
אימייל{{email}}האימייל מכרטיס הליד
סטטוס{{status_name}}שם הסטטוס ברגע השליחה
מקור הגעה{{Created_BY}}מה שכתוב בכרטיס הליד תחת מקור הגעה, למשל פייסבוק
קמפיין{{source}}מה שכתוב בכרטיס הליד תחת קמפיין
מזהה ליד{{lead_id}}מספר הליד ב-TASKEY
  • משנים שמות עמודות בצד השמאלי, ומוחקים שורה שלא צריך (שימו לב לפסיקים: אחרי השורה האחרונה אין פסיק). שם שמשנים אחרי שכבר נכתבו שורות נפתח כעמודה חדשה בסוף הגיליון.
  • עוד משתנים: {{city}} עיר, {{address}} כתובת, {{ad}} מודעה, {{channel}} ערוץ, {{last_comment}} התגובה האחרונה. הרשימה המלאה, כולל השדות המותאמים של החשבון, נפתחת בלחיצה על משתנים זמינים מעל התיבה.
  • {{source}} הוא הקמפיין. ברשימת המשתנים הוא נקרא "מקור ליד", אבל הוא מחזיר את מה שכתוב בכרטיס תחת קמפיין. בשביל מקור הגעה משתמשים ב-{{Created_BY}}.

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

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

5. בודקים שזה עובד

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

שורת Webhook בלוג הפעולות: הכתובת, הנתונים שנשלחו והתגובה ok true

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

מה רואים בלוגמה זה אומר
הצלחה, ובתגובה ok: trueהשורה נכתבה בגיליון
הצלחה, ובתגובה דף HTML של Google במקום ok: trueGoogle לא הריץ את הסקריפט. בדרך כלל Who has access אינו Anyone, או שהכתובת שגויה או שייכת לפריסה שנמחקה
הצלחה, ובתגובה ok: falseהסקריפט רץ ונכשל. הסיבה כתובה ב-error
נכשל, ומתחת כרטיס אדום סיבת כשלוןTASKEY לא הצליח להגיע לכתובת, והסיבה כתובה בכרטיס. בדקו את הכתובת ולחצו הרץ שוב בסוף השורה
דולג, ובעמודות טריגר ו-סוג פעולה כתוב ליד מ-APIהליד הגיע, אבל הטריגר לא רץ. השורה הזו לא שייכת לטריגר מסוים, ולכן היא מופיעה רק ב-לוג פעולות המלא (הכפתור בראש דף הטריגרים), לא בשעון שבכרטיס הטריגר. פתחו את השורה: הסיבה כתובה תחת הטריגר דולג — הסיבה. למשל: אותו מקור הגעה כבר נקלט לליד הזה ב-15 הדקות האחרונות (פנייה כפולה), או שהליד נקלט מהודעת וואטסאפ נכנסת
אין שורה בלוגלפני שמסיקים שהטריגר לא רץ, פתחו גם את לוג פעולות המלא וחפשו שורת דולג (השורה הקודמת בטבלה). אין גם שם? ליד ידני לא מפעיל את הטריגר. בדקו גם שתיבת הסימון פעולה פעילה בחלון הפעולה מסומנת

בדיקה מהירה של הסקריפט פתחו את כתובת ה-Web App בדפדפן. אם מופיע טקסט עם ok ו-true, הסקריפט פרוס ופתוח. כל ליד שנכתב מופיע גם בכרטיס הליד, בטאב טריגרים.

6. פתרון בעיות

תופעהמה עושים
לא נכתבות שורותבדקו בלוג הפעולות מה חזר (הטבלה בסעיף 5). ודאו ש-Who has access הוא Anyone ושהכתובת מסתיימת ב-‎/exec, לא ב-‎/dev
Google ביקש הרשאות ודילגתיעשו Deploy מחדש ואשרו (Allow)
שיניתי את הקוד וכלום לא השתנהפרסמו גרסה חדשה: Manage deployments, עריכה, New version, Deploy
כל ליד נכתב פעמייםיש לטריגר שתי פעולות Webhook, או ששני טריגרים שולחים לאותה כתובת. בדקו בדף הטריגרים כמה פעולות Webhook יש בכרטיס ומחקו את המיותרת
אותו אדם מופיע בכמה שורותליד חוזר מפעיל שוב את ליד מ-API, ובטריגר מסוג שינוי כל שינוי מוסיף שורה. הסקריפט רק מוסיף שורות, הוא לא מעדכן שורה קיימת
העמודות לא בסדר שרציתיגררו את העמודות בגיליון למקום שרוצים. הסקריפט מתאים כל ערך לפי שם הכותרת, לא לפי המיקום. רק אל תשנו את טקסט הכותרות עצמן
עמודה ריקההמשתנה לא מוכר או שהשדה ריק בכרטיס הליד. בדקו את שם המשתנה ברשימת משתנים זמינים

שאלות נפוצות

זה עולה כסף? לא. Google Apps Script חינמי ורץ בחשבון Google שלכם. אין צורך במנוי ל-Make או ל-Zapier.

אפשר לשלוח לגיליון גם רכישות או פגישות? כן. צרו טריגר על טבלת הרכישות או הפגישות עם אותה פעולת Webhook. גם בטריגר על טבלה אחרת, משתני הליד של התבנית המותאמת ({{full_name}}, {{phone}}, {{email}}, {{lead_id}} וכו') נשלפים מהליד שהרכישה או הפגישה שייכת לו. כדי שהרכישות ייכתבו לגיליון נפרד, צרו גיליון חדש עם עותק של הסקריפט וכתובת Web App משלו.

הנתונים מאובטחים? הגיליון נשאר פרטי בחשבון Google שלכם. הכתובת מאפשרת רק להוסיף שורות, לא לקרוא. שמרו אותה כמו סיסמה.

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

צריכים עזרה? כתבו לנו בוואטסאפ053-9472201 · תמיכה ותיאום הדרכה, א'-ה' 10:00-16:00

תפריט נגישות