חיבור לידים ל-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)
- פתחו גיליון Google Sheets חדש (הקלידו
sheets.newבדפדפן) או גיליון קיים. - בתפריט לחצו Extensions → Apps Script (בעברית: הרחבות → Apps Script).
- מחקו את הקוד לדוגמה והדביקו במקומו את כל הקוד שלמטה. אפשר גם להוריד אותו כקובץ.
- לחצו על סמל השמירה.
הורדת קובץ הסקריפט (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)
- ב-Apps Script לחצו Deploy → New deployment (פריסה → פריסה חדשה).
- ליד Select type בחרו Web app.
- ב-Execute as בחרו Me (החשבון שלכם).
- ב-Who has access בחרו Anyone. בלי זה TASKEY לא יוכל לכתוב לגיליון.
- לחצו Deploy. בפעם הראשונה Google מבקש לאשר הרשאות: אשרו (Allow).
- העתיקו את ה-Web app URL. זו כתובת שמסתיימת ב-
/exec.
הכתובת היא כמו סיסמה. כל מי שיש לו את כתובת ה-
/execיכול להוסיף שורות לגיליון (לקרוא אותו הוא לא יכול). אל תפרסמו אותה ואל תשלחו אותה בקבוצות.
שיניתם את הקוד אחרי הפריסה? השינוי לא נכנס לתוקף עד שמפרסמים גרסה חדשה: Deploy → Manage deployments, עריכה (סמל העיפרון), ב-Version בוחרים New version ולוחצים Deploy. הכתובת נשארת אותה כתובת.
3. יוצרים טריגר ב-TASKEY
- פתחו הגדרות → טריגרים ולחצו הוספת טריגר חדש.
- בשלב סוג ההפעלה בחרו ליד מ-API (חדש או חוזר) ולחצו המשך.

- בשלב הגדרות בחרו את הטבלה לידים ולחצו המשך.
- בשלב שם וסיכום תנו שם, למשל "Google Sheets: כל ליד חדש לגיליון", ולחצו שמור טריגר.
ליד מ-API רץ על כל ליד שמגיע מטופס באתר, מפייסבוק, מ-Make או מכל חיבור אחר, גם על ליד חוזר. רוצים בגיליון משהו אחר? בוחרים סוג הפעלה אחר:
| מה רוצים בגיליון | סוג ההפעלה | מה בוחרים בשלב הגדרות |
|---|---|---|
| כל ליד חדש מטופס, מפייסבוק או מחיבור | ליד מ-API (חדש או חוזר) | טבלה: לידים |
| לידים שעברו לסטטוס מסוים, למשל "נסגר" | שינוי | טבלה: לידים, שם השדה: סטטוס, ערך השדה: הסטטוס |
| כל שינוי סטטוס | שינוי | טבלה: לידים, שם השדה: סטטוס, ערך השדה: כל ערך (ללא תנאי) |
ליד שהוספתם ידנית לא ייכתב לגיליון. ליד שנוצר ידנית במערכת לא מפעיל ליד מ-API. גם אותו ליד שנכנס שוב מאותו מקור בתוך 15 דקות (למשל טופס שנשלח פעמיים) לא מפעיל אותו. עוד על סוגי ההפעלה: טריגרים ואוטומציות.
4. מוסיפים פעולת Webhook
- הטריגר החדש מופיע בראש דף הטריגרים, תחת לידים מ-API. לחצו על + בכרטיס שלו.

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

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

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

- לחצו שמור שינויים פעם אחת. הכפתור מתחלף ל"נשמר בהצלחה". סגרו את החלון בסגור.
- הדף מתרענן לבד. בכרטיס הטריגר מופיעה עכשיו פעולת 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. בודקים שזה עובד
- שלחו ליד בדיקה מטופס שמחובר ל-TASKEY: טופס באתר, טופס לידים בפייסבוק או כל חיבור אחר. ליד ידני לא יפעיל את הטריגר.
- פתחו את הגיליון. תוך כמה שניות נוספת שורה, ובפעם הראשונה גם שורת כותרות.
- לא הגיעה שורה? בדף הטריגרים לחצו על לוג פעולות בראש הדף (הוא מציג הכול, כולל טריגרים שדולגו), או על שעון ההיסטוריה בכרטיס הטריגר (רק השורות של הטריגר הזה). פתחו את השורה בחץ שבתחילתה.

מימין, נתונים שנשלחו: הכתובת והנתונים של הליד לפי התבנית. משמאל, תגובה: מה שהסקריפט ענה. ok: true אומר שהשורה נכתבה.
| מה רואים בלוג | מה זה אומר |
|---|---|
הצלחה, ובתגובה ok: true | השורה נכתבה בגיליון |
הצלחה, ובתגובה דף HTML של Google במקום ok: true | Google לא הריץ את הסקריפט. בדרך כלל 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.