ניהול קמפיינים בגוגל אדוורדס באמצעות Google Adwords Scripts

שוקי מן
סקריפטים בגוגל אדוורדס

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

אבל לפני שנתחיל חשוב לי להקדים ולציין שתי נקודות חשובות כדי שלא אאבד אתכם כבר בהתחלה:

1. Adwords Scripts זה לא שפת תכנות!

אני מדגיש את זה כי אני יודע שלחלק מקוראי הבלוג אין רקע תכנותי והעובדה שיש צורך בכתיבה של “קוד” כדי להשתמש בAdwords Scripts עלולה אולי להפחיד אתכם ולגרום לכם לא לקרוא את הפוסט – אז זהו שלא. Adwords Scripts זה ממש לא שפת תכנות אלא אוסף של פונקציות מיוחדות שהמתכנתים של גוגל הכינו עבורנו, כדי שבעזרתם נוכל לשלוט בחשבון האדוורדס שלנו מבלי בכלל לגעת ב-API. מה זה פונקציה? לא רלוונטי. מצדי תקראו לזה “מילת קסם שמבצעת פעולות”.

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

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

2. Adwords Scripts לא נועדו רק לחשבונות גדולים

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

חשוב לי להבהיר שגם זו טעות, כי עם Adwords Scripts אפשר לעשות כמעט הכל וגם אם אתם לא מנהלים תקציבים של 5 ספרות (בשבוע, בדולרים…) כדאי לכם מאוד לקרוא את הפוסט כי תמצאו בו קטעי קוד שיהיו שימושיים גם עבורכם. חוצמזה שגם אם לא תשתמשו בסקריפטים בתקופה הקרובה – לפחות תדעו על מה מדובר כשזה יהיה רלוונטי.

מוכנים? אז בואו נתחיל!

מה הדרכים כיום לבצע פעולות בגוגל אדוורדס?

1. הממשק הרגיל של אדוורדס כמו שכולנו מכירים.

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

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

2. Adwords Editor – תוכנה למחשבים אישיים.

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

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

3. Automated Rules – כללים אוטומטיים.

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

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

4. Adwords Scripts

יתרונות: מאפשר לעשות כמעט הכל בחשבון האדוורדס, והכל באופן אוטומטי:

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

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

5. Adwords API

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

הכל טוב ויפה, אבל למה אני צריך את זה בכלל?!

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

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

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

הפתרון נמצא כמובן באדוורדס סקריפטס – גוגל מספקת לנו סקריפט לדוגמא שנקרא Bid By Weather והוא מאפשר לכם להתחבר ל-API של תחזית מזג האוויר, לקבוע תנאים מותאמים אישית שישנו את הבידים שלכם על פי מזג האוויר שיתקבל מה-API, והכל באמצעות טבלת אקסל פשוטה של Google Spreadsheet.

ככה זה נראה באמיתי:

טבלה ב-Spreadsheet של גוגל

מגניב לא?

אז הנה עוד דוגמא:

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

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

איפה נמצא הממשק של Adwords Scripts?

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

לאחר מכן לחצו על Bulk operations בצד שמאל ולאחר מכן על Scripts (לחצו על התמונה להגדלה):

Bulk operations

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

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

authorize

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

(לידיעה כללית – כאן תוכלו לראות את כל היישומים החיצוניים שנתתם להם אישור לשימוש במוצרי הגוגל שלכם: כנסו ל- https://security.google.com/settings/security ולאחר מכן תרדו לConnected applications and sites. כדאי לבדוק מדי פעם שאין שם איזה יישום לא רצוי שבטעות נתתם לו אישור לפני כמה שנים).

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

סקריפט לדוגמא

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

var campaignSelector = AdWordsApp.campaigns()
.withCondition(“Impressions > 10”)
.orderBy(“Impressions DESC”)
.forDateRange(“YESTERDAY”).get();

while (campaignSelector.hasNext()) {
var campaign = campaignSelector.next();
Logger.log(“Campaign “+ campaign + “ had more than 10 impressions yesterday.”);
}

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

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

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

דבר שני, בסקריפט שלכם אתם יכולם לשלב גם פונקציות של מוצרים נוספים של גוגל כמו ג’ימייל ו-Google Spreadsheet אבל התצוגה המקדימה יכולה לפעול אך ורק על פקודות של AdWordsApp! זה אומר שאם תכניסו פקודה שקשורה לג’ימייל או לשירות אחר של גוגל – הפקודה תרוץ על רטוב למרות שאתם במצב התצוגה המקדימה. חשוב מאוד לזכור את זה כי אם תכתבו סקריפט שאמור לבצע שינויים בחשבון האדוורדס, ולהכניס אותם לדוח אקסל (של גוגל) שישלח אליכם במייל – אז במצב התצוגה המקדימה השינויים באדוורדס לא יתבצעו אבל המייל כן ישלח ודוח האקסל כן יופק.

לצורך הדוגמא נסו לעשות preview לקוד הבא (אל תשכחו לרשום את המייל האמיתי שלכם):

function main() {
var accountId = AdWordsApp.currentAccount().getCustomerId();
MailApp.sendEmail(“YourMail@gmail.com”,”This is preview for account no. ” + accountId, “שלום! המייל הזה נשלח אליך למרות שאתה נמצא במצב תצוגה מקדימה. “);
}

עכשיו כנסו לתיבת המייל שלכם, מחכה לכם שם הפתעה.

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

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

בדיוק בשביל זה יש לנו 2 פונקציות שבודקות האם אנחנו נמצאים במצב של תצוגה מקדימה, ורק אם התשובה שלילית הם מבצעות את הפעולות שהגדרנו להם. אם תכתבו את הקוד הזה למשל, תגלו שהמייל לא ישלח למרות שהקריאה ל-MailApp נשארה אותו דבר. הסיבה היא מכיון שהכנסנו את פקודת שליחת המייל בתוך תנאי מסויים, ולכן רק אם התנאי מתקיים – הפקודה תרוץ:

function main() {
var accountId = AdWordsApp.currentAccount().getCustomerId();
if (!AdWordsApp.getExecutionInfo().isPreview()) {MailApp.sendEmail(“YourMail@gmail.com”,”This is preview for account no. ” + accountId, “שלום! המייל הזה ישלח אליך רק אם תריץ את הסקריפט בזמן אמת. “);} else {Logger.log(“אתה נמצא בתצוגה מקדימה ולכן המייל לא ישלח”);}
}

הפעם, בגלל שהוספנו את משפט התנאי אתם תראו הודעה אחרת בשדה הלוג למטה.

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

ממה מורכב הסקריפט

Entities

ה-Entities הם בעצם “אלמנטים” (בתרגום חופשי) שעליהם אנחנו רוצים לבצע את הפעולות שלנו.

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

סלקטורים + Iterators

סלקטורים הם בעצם פונקציות קבועות בAdwords Scripts ובעזרתם אנחנו יכולים לבחור את האלמנטים (Entities) עליהם נרצה לבצע את הפעולות שלנו.

לאחר שבחרנו את האלמנטים – אנחנו מגדירים לולאה (Iterator) שרצה על כל התוצאות שהתקבלו ומבצעת עליהם את המניפולציה הדרושה.

כדי שתבינו יותר טוב את התפקיד של הסלקטורים והלולאות ב-Adwords Scripts אני רוצה להביא דוגמא קטנה:

נגיד שאתם מנהלים של בית ספר יסודי (א’-ו’) ובכל חודש יש אצלכם מבחן באנגלית לכל תלמידי בית הספר. במבחן האחרון ראיתם שהבנים בכיתה ה’ קיבלו ציונים נמוכים ולכן החלטתם לתת להם פקטור. יחד עם זאת – הפקטור ינתן רק למי שקיבל בין 50 ל-70 מכיוון מי שקיבל מתחת ל-50 כנראה שלא למד בכלל למבחן ולכן לא מגיע לו 🙂

בכל אופן כדי לתת את הפקטור רק לבנים בכיתה ה’ שקיבלו 50-70 אתם צריכים לבנות סלקטור עם מספר תנאים:

  1. רק התלמידים בבית הספר שלכם (ולא בשאר בתי הספר בעיר) >
  2. רק אלו בכיתה ה’ >
  3. רק הבנים >
  4. רק אלו שקיבלו 50-70 >
  5. במבחן באנגלית >
  6. שהתקיים בשבוע שעבר.

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

בואו נראה דוגמא מסקריפט שעליו נדבר בהמשך. במקרה הזה אנחנו רוצים לבצע פעולה מסויימת על כל מילות המפתח בקמפיין בשם “My Campaign” שבשבוע האחרון היה להם ציון איכות גדול מ-5 וקטן או שווה ל7. אז קודם כל אנחנו אומרים לסקריפט שיקח את כל התוצאות שמתאימות לסלקטור שהגדרנו, ויכניס אותם לתוך משתנה בשם box:

var box = AdWordsApp.keywords().withCondition(“CampaignName = ‘My Campaign’ “).withCondition(QualityScore <= 7″).withCondition(QualityScore > 5″).forDateRange(“LAST_WEEK”).get();

בואו נסביר את כל הסלקטורים:

AdWordsApp – הקדמה הכרחית שאומרת לסקריפט שמדובר בפעולות השייכות לחשבון אדוורדס. מכיוון ש-Adwords Scripts זה רק חלק אחד מתוך כל ה-Google Apps Scripts – אנחנו יכולים להתייחס בסקריפט שלנו למוצרים נוספים של גוגל כמו Spreadsheet (ואז נכתוב SpreadsheetApp), ג’ימייל (ואז נכתוב MailApp) ועוד ועוד.

  • keywords() – פונקציה (סלקטור) שכאשר קוראים לה היא נותנת לנו בחזרה את כל מילות המפתח בחשבון. כדי לסנן את התוצאות נשתמש בעוד כמה פונקציות מסוגים שונים:
  • withCondition(“CampaignName = ‘My Campaign’ “) – פונקציה מסוג פילטר שמסננת את התוצאות שנתנה לנו הפונקציה הקודמת (הסלקטור שלנו) על פי התנאים שניתן לה. במקרה שלנו – רק מילות המפתח שנמצאות בקמפיין בשם My Campaign.
  • forDateRange(“LAST_WEEK”) – פונקציה מסוג פילטר שכאשר אנחנו קוראים לה היא מחזירה את התוצאות רק של השבוע האחרון.
  • withCondition(“QualityScore <= 7”) – שוב פעם פונקציה מסוג פילטר – מחזירה רק את מה שהיה לו ציון איכות קטן או שווה ל7…
  • withCondition(QualityScore > 5″) – וגדול מ-5.
  • get() – את כל אלו תכניס למשתנה בשם “box” שאותו הגדרנו בהתחלה (var box = …).

אם ננסה לתרגם את הדוגמא עם התלמידים לקוד בשפה של ה-Adwords Scripts, אז היינו צריכים לכתוב את הדבר הבא:

var box = OurSchool.students().withCondition(“Only F Grade”).withCondition(“Only Boys”).withCondition(“Only English Test”).forDateRange(“LAST_WEEK”).get();

  • OurSchool – בית הספר שלנו (ולא כל בתי הספר בעיר),
  • students() – תלמידים (ולא מורים או מנהלים),
  • withCondition(“Only F Grade”) – רק אלו שבכיתה ה’,
  • withCondition(“Only Boys”) – רק הבנים,
  • withCondition(“Only English Test”) – רק הציונים של המבחן באנגלית,
  • forDateRange(“LAST_WEEK”) – המבחן של השבוע האחרון.

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

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

while(box.hasNext()) {
          var student = box.next();
          if student.score() > 50 AND student.score() < 70 {
                        student.score() = student.score()*1.4 ;
          };
}

אל תבהלו. זו לולאה פשוטה ומאוד לוגית ונסביר אותה בצורה הכי ברורה שאפשר (אם לא ברור – תשאלו בתגובות בסוף הפוסט):

נגיד שמתוך 30 התלמידים בכיתה ה’ בבית הספר שלנו היו רק 5 תלמידים שענו על הקריטריונים שהגדרנו ולכן בתוך הקופסא שלנו נמצאים עכשיו 5 תלמידים:

  1. אברהם – קיבל 80.
  2. יצחק – קיבל 70.
  3. יעקב – קיבל 65.
  4. ראובן – קיבל 30.
  5. שמעון – קיבל 52.

הלולאה מתחילה מהתלמיד ה-0, ואומרת כזה דבר:

כל עוד יש תלמיד נוסף שעוד לא בדקתי – תבצע את הדברים הבאים שבתוך הסוגריים המסולסלות:

{תיצור משתנה בשם student ותכניס אליו את התלמיד הבא שברשימה. לאחר מכן תבדוק האם הציון של אותו תלמיד גדול מ-50 וגם קטן מ-70 ואם כן – תוסיף לציון שלו פקטור.}

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

במקרה שלנו הדו שיח בין הלולאה לסקריפט יראה כך:

האם יש תלמיד הבא בתור? כן. אברהם.

יופי. תיצור משתנה בשם student ותכניס אליו את אברהם.

האם הציון של אברהם גדול מ-50 וקטן מ-70? לא.

טוב. תחזור לתחילת הלולאה.

האם יש תלמיד הבא בתור? כן. יצחק.

יופי. תיצור משתנה בשם student ותכניס אליו את יצחק.

האם הציון של יצחק גדול מ50 וקטן מ70? לא (70 זה לא קטן מ-70).

טוב. תחזור לתחילת הלולאה.

האם יש תלמיד הבא בתור? כן. יעקב.

האם הציון של יעקב גדול מ50 וקטן מ70? כן.

טוב. תוסיף לו את הפקטור.

תחזור לתחיל הלולאה.

וכן הלאה וכן הלאה… אני חושב שהבנתם את הקטע.

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

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

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

עכשיו בואו נראה דוגמא מסקריפט אמיתי שבאמת עושה משהו:

var our_variable = AdWordsApp.keywords()
       .withCondition(“CampaignName = ‘My Campaign’ “)
       .withCondition(QualityScore > 7″)
       .forDateRange(“LAST_WEEK”)
       .get();
while(our_variable.hasNext()) {
      var keyword = our_variable.next();
      keyword.setMaxCpc(keyword.getMaxCpc() * 1.05);
}

מה שהסקריפט הזה עושה במילים פשוטות זה פשוט עובר על כל מילות המפתח בקמפיין בשם My Campaign, בודק אם ציון האיכות שלהם היה גבוה מ-7 במהלך השבוע האחרון ואם כן – מעלה את הביד שלהם ב-5%.

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

נכון שזה פשוט כשמבינים את זה?

עכשיו נכנס למים העמוקים יותר ונסקור כמה פונקציות שימושיות מאוד

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

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

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

מתודות

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

עוד מתודות

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

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

1. withCondition() – פילטר שמסנן את הערכים שהתקבלו מהסלקטור על פי הפרמטרים שנכניס בתוך הסוגריים. הפונקציה withCondition יכולה לקבל ערכים שונים על פי הסלקטור שעליו היא הופעלה. כך למשל אם נכתוב

var campaigns = AdWordsApp.campaigns().withCondition(“Name=’_______'”).get();

נצטרך לציין בname את שם הקמפיין אותו אנחנו רוצים. לעומת זאת אם נכתוב:

var campaigns = AdWordsApp.adGroups().withCondition(“Name=’_______'”).get();

נצטרך לכתוב בname את השם של קבוצת המודעות.

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

var keywords = AdWordsApp.keywords().withCondition(“Clicks > 5”).withCondition(“Impressions < 20”).get();

יתן לנו רק את מילות המפתח שקיבלו יותר מ-5 קליקים וגם קיבלו פחות מ20 חשיפות. כלומר שה-CTR שלהם גבוה יחסית.

2. withIds() – פילטר שמסנן את האלמנטים שהתקבלו על פי המספר הייחודי של האלמנט. כך למשל אם נכתוב:

var campaigns = AdWordsApp.campaigns().withIds([12345]).get();

זה יתן בדיוק את אותו הדבר כמו:

var campaigns = AdWordsApp.campaigns().withCondition(“Name=’Our Campaign'”).get();

מכיוון שהמספר המזהה של קמפיין Our Campaign הוא 12345.

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

3. forDateRange() – פונקציה מסוג פילטר שמחזירה לנו את הערכים על פי התאריך שאנחנו מציינים.

את הערכים אפשר לציין עם מילות בודדות בצורה מאוד אינטואיטיבית (TODAY, YESTERDAY, LAST_7_DAYS, THIS_WEEK_SUN_TODAY, LAST_WEEK, LAST_14_DAYS, LAST_30_DAYS, LAST_BUSINESS_WEEK, LAST_WEEK_SUN_SAT, THIS_MONTH, LAST_MONTH, ALL_TIME)

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

למשל:

var results = AdWordsApp.adGroups().withCondition(“Impressions > 200”).forDateRange(“20130524”,“20130524”).get();

יתן את כל קבוצות המודעות שקיבלו יותר מ200 חשיפות בתאריך 24/5/2013. במקרה הזה נקבל תוצאות של יום בודד, מכיוון שציינו את אותו תאריך בשני הפרמטרים.

4. orderBy() – מסדר את התוצאות בסדר מסוים (שימושי בעיקר כשרוצים להפיק דוחות אוטומטיים ולסדר את הנתונים בסדר מסוים). למשל:

  • orderBy(“Ctr ASC”) – אחוזי הקלקה בסדר עולה
  • orderBy(“MaxCpc DESC”) עלות מקסימלית לקליק – סדר יורד
  • orderBy(“Clicks DESC”) – קליקים בסדר יורד
  • orderBy(“Impressions DESC”) – הופעות בסדר יורד

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

AdWordsApp.adGroups().orderBy(“Clicks DESC”).orderBy(“Impressions ASC”).get();

זה יתן לנו את קבוצות המודעות במיון לפי מספר הקליקים בסדר יורד, ובמידה ויהיו 2 קבוצות מודעות עם אותו מספר קליקים – הם יסודרו לפי מספר ההופעות בסדר עולה (הנמוך קודם).

5. withLimit() – שימושי במיוחד בסקריפטים שאמורים לטפל במספר נתונים גדול במיוחד. מאפשר לנו לציין את המגבלה של הנתונים אותם אנחנו רוצים לקבל כדי שלא נעמיס על הסקריפט יותר מדי ונעבור את מגבלת ה-30 דקות.

2 הערות חשובות לפני שאנחנו ממשיכים:

  1. שימו לב שכאשר הפונקציה כוללת מספר מילים הן יתחילו באות גדולה (חוץ מהמילה הראשונה) – זה הכרחי אחרת תקבלו הודעת שגיאה. למשל: forDateRange, withCondition וכד’.
  2. ניתן לעשות את הסינון גם בתוך הלולאה עצמה במקום בתוך הסלקטור. כך למשל הקוד הזה:
var keywords = AdWordsApp.keywords().withCondition(“Clicks > 10”).forDateRange(“LAST_MONTH”).get();
while (keywords.hasNext()) {
var keyword = keywords.next();
// תבצע את הפעולות על כל מילות המפתח שקיבלת
}

יתן בדיוק את אותה תוצאה כמו הקוד הזה:

var keywords = AdWordsApp.keywords().get();
while (keywords.hasNext()) {
var keyword = keywords.next();
if (keyword.getStatsFor(“LAST_MONTH”).getClicks() > 10) {
// תבדוק אם מילת המפתח קיבלה יותר מ10 קליקים בחודש האחרון, ואם כן – תבצע עליה פעולות
  };
}

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

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

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

פקודות שימושיות

  • .pause(); // עצור את הקמפיין/קבוצת מודעות/מודעה/מילת מפתח
  • .enable(); // המשך את הקמפיין/קבוצת מודעות/מודעה/מילת מפתח
  • campaign.setBudget(850); // קבע תקציב יומי לקמפיין
  • keyword.setMaxCpc(0.25); // קבע ביד חדש למילת המפתח (שנבחרה קודם)
  • adGroup.createKeyword(“google advertising”); // צור מילת מפתח בהתאמה רחבה
  • adGroup.createKeyword(“/”google advertising”/”); // צור מילת מפתח בהתאמה לביטוי
  • adGroup.createKeyword(“[google advertising]”); // צור מילת מפתח בהתאמה מדוייקת
  • adGroup.createTextAd(“כותרת המודעה”, “שורה ראשונה”, “השורה השניה”, “כתובת הקישור”, “הכתובת לתצוגה”);
  • AdWordsApp.campaigns().withCondition(“Name STARTS_WITH_IGNORE_CASE ‘Some Client – ‘”); //  בחירת קמפיין על פי המילים שהוא מתחיל בהם. שימושי מאוד כשרוצים לבחור קמפיין בנושא מסויים ויש לכם קמפיין אחד לרשת המדיה ואחד לחיפוש.
  • AdWordsApp.adGroups().withCondition(“CampaignName STARTS_WITH ‘My Campaign'”); // בחירת קבוצת מודעות על פי הקמפיין אליו הם שייכות
  • AdWordsApp.adGroups().withCondition(“Name CONTAINS ‘Promotion'”); // בחירת קבוצת מודעות על פי השם שלהם
  • AdWordsApp.keywords().withCondition(“Text CONTAINS_IGNORE_CASE ‘shoes'”); // בחירת מילות מפתח על פי מילים כלולות בלי הקפדה על אותיות רישיות.
  • ad.isMobilePreferred() // בודק אם יש תיעדוף לניידים למודעה שבחרנו
  • ad.setMobilePreferred() // קובע תיעדוף לניידים למודעה שבחרנו
  • AdWordsApp.campaign().extensions().phoneNumbers().get(); // נותן את כל תוספי השיחה של הקמפיין

ועוד ועוד… את רשימת הפונקציות המלאה תוכלו לראות כאן.

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

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

סקריפט 1: טיפול במילות מפתח עם ביד נמוך מדי

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

var ourkeywords = AdWordsApp.keywords().get();
while (ourkeywords.hasNext()) {
var keyword = ourkeywords.next();
if (keyword.maxCpc < keyword.getTopOfPageCpc()){
keyword.setMaxCpc(keyword.maxCpc*1.3);
};
}

ההגיון של הסקריפט הזה נורא פשוט:

  1. תכניס את כל מילות המפתח בחשבון לתוך משתנה בשם ourkeywords.
  2. תיצור לולאה שתעבור על כל מילה ומילה, ובמידה והביד המקסימלי (max.Cpc) קטן מהעלות שגוגל דורשת עבור הופעה בראש העמוד (getTopOfPageCpc) – תעלה את הביד ב30%.

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

הפונקציות שהשתמשנו הן:

  • keywords() – סלקטור שמחזיר את כל מילות המפתח בחשבון.
  • keyword.maxCpc() – פונקציה שבודקת את המחיר המקסימלי שהצענו לקליק עבור מילת המפתח הספציפית שכרגע נמצאת בלולאה שלנו.
  • keyword.getTopOfPageCpc() – בודקת את העלות שגוגל דורש מאיתנו לראש העמוד עבור מילת המפתח הספציפית הזו.
  • keyword.setMaxCpc(keyword.maxCpc*1.3) – קובע את מה שמצויין בתוך הסוגריים בתור הביד המקסימלי של מילת המפתח שלנו.

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

function main() {
  var allOurCampaigns = AdWordsApp.campaigns()
      .forDateRange(“LAST_MONTH”)
      .get();
  while (allOurCampaigns.hasNext()) {
    var campaign = allOurCampaigns.next();
    var stats = campaign.getStatsFor(“LAST_MONTH”);
    Logger.log(“בחודש האחרון, העלות של קמפיין ” + campaign.getName() +
        ” היתה ” + stats.getCost() +
        ” והוא קיבל ” + stats.getClicks() + ” קליקים”);
  }
}

סקריפט 3: מודעה שסופרת לאחור את השעות שנותרו לאירוע

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

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

במקום זה, תוכלו לעשות את הדבר הבא:

1. צרו קבוצת מודעות רגילה, כולל מילות מפתח כמובן.

2. איפה שאתם רוצים להציג את הטקסט הדינמי תכתבו {param1: טקסט ברירת מחדל1} ו-{param2: טקסט ברירת מחדל2}. למשל מודעה לכנס של פבל תראה כך:

סקריפט לכנס

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

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

var END_DATE = new Date(‘December 11, 2013’);
var AD_GROUP_NAME = ‘אלו שמחפשים את הכנס’;
var AD_GROUP_NAME_IN_PROGRESS = ‘מודעות שיוצגו ביום הכנס’;
var END_DATE_OF_KENES = new Date(‘December 12, 2012’);
function main() {
  var timeLeft = calculateTimeLeftUntil(END_DATE);
  var adGroup = getAdGroup(AD_GROUP_NAME);
if (timeLeft[‘days’] <= 0 && timeLeft[‘hours’] <= 0) {
    adGroup.pause();
    adGroup = getAdGroup(AD_GROUP_NAME_IN_PROGRESS);
    adGroup.enable();
    timeLeft = calculateTimeLeftUntil(END_DATE_OF_KENES, new Date());
  }
  var keywords = adGroup.keywords().get();
  while (keywords.hasNext()) {
    var keyword = keywords.next();
    // כאן אנחנו מגדירים את פרמטר 1 להיות הימים שנשארו, ופרמטר 2 יהיה השעות שנשארו.
    keyword.setAdParam(1, timeLeft[‘days’]);
    keyword.setAdParam(2, timeLeft[‘hours’]);
  }
}
var DAY_IN_MILLISECONDS = 1000*60*60*24;
function calculateTimeLeftUntil(end) {
  var current = new Date();
  var timeLeft = {};
  var daysFloat = (end – current) / (DAY_IN_MILLISECONDS);
  timeLeft[‘days’] = Math.floor(daysFloat);
  timeLeft[‘hours’] = Math.floor(24 * (daysFloat – timeLeft[‘days’]));
  return timeLeft;
}
function getAdGroup(name) {
  var adGroupIterator = AdWordsApp.adGroups()
      .withCondition(‘Name = “‘ + name + ‘”‘)
      .withLimit(1)
      .get();
  if (adGroupIterator.hasNext()) {
    return adGroupIterator.next();
  }
}

4. שמרו את הסקריפט, חזרו למסך הראשי עם רשימת כל הסקריפטים ולחצו על create schedule.

Create Schedule

לאחר מכן בחרו בתדירות לפי שעה, לחצו על save ואז על run.

הגדרת תדירות

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

במודעה השניה תוכלו לכתוב משהו כמו:

מודעה ביום הכנס

סיכום ומספר קישורים להעשרה

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

  1. דוחות – כל נושא הדוחות באדוורדס סקריפטס מטופל ע”י פקודות מורכבות יותר שקשורות לAPI ולכן לא נגענו בהם. נכון, אני יודע שחלקכם בוודאי מאוכזבים (מי לא היה רוצה להכין דוח מותאם אישית שנשלח אוטומטית ללקוח בסוף החודש?) אבל אין מה לעשות, תצטרכו ללמוד את זה לבד בקישור הזה.
  2. אינטגרציה עם שירותים נוספים של גוגל – למרות שנושא הדוחות הוא מורכב יותר, מה שכן תוכלו לעשות בקלות זה ליצא נתונים מותאמים אישית לSpreadsheetApp ואותם לשלוח ללקוחות במייל בעזרת שימוש בMailApp. כדי להפיק את המקסימום מ-Adwords Scripts כדאי מאוד מאוד מאוד ללמוד איך להשתמש בMailApp (גוגל סקריפטס לג’ימייל) ו-SpreasheetApp (גוגל סקריפטס לאקסל של גוגל). אחרי הפוסט הנוכחי יהיה לכם הרבה יותר קל לעשות את זה, אז קדימה לעבודה.
  3. כאן יש מאגר סקריפטים מוכנים מראש לאדוורדס שמתאימים כמעט לכל מטרה – www.freeadwordsscripts.com/ וגם באתר הרשמי של גוגל יש כמה סקריפטים נחמדים: https://developers.google.com/adwords/scripts/docs/solutions/.
    הסקריפטים מיועדים לשימוש רחב ולכן כותב הסקריפטים מצרף להם הסברים קצרים ומראה לכם בדיוק אילו פרמטרים אתם צריכים לשנות כדי להתאים אותם לצרכים שלכם.

מקווה שנהניתם, מוזמנים לשתף עם אחרים וכמובן לכתוב בתגובות מה דעתכם 🙂

נכתב על ידי
שוקי מן, מנכ”ל חברת LIXFIX המספקת שירותי פרסום בגוגל ואופטימיזציה עם גוגל אנליטיקס. חברת LIXFIX הינה מוסמכת גוגל אדוורדס וגוגל אנליטיקס והיא מספקת שירותי אופטימיזציה ללקוחות גדולים בארץ ובחו”ל. בנוסף לחברת LIXFIX, שוקי הינו היזם מאחורי All Things Data, שמפיקה את כנס האנליטיקס הגדול בארץ ומפעילה את מכללת ATD ללימוד מקצועות הדטא.
0 0 הצבעות
קלות השימוש
0 0 הצבעות
פיצ'רים ופונקציונליות
0 0 הצבעות
תמיכה טכנית
0 0 הצבעות
תמורה לכסף
הרשמו
הודע על
guest

52 תגובות
הישן ביותר
החדש ביותר בעלת הכי הרבה הצבעות
פידבקים מוטבעים
צפייה בכל התגובות

תוכן עניינים

52
0
נשמח לשמוע את דעתך, נודה לתגובהx
שיווק דיגיטלי שמביא תוצאות.
לוגו דייסון

189%

יחס המרה למודעות

לוגו איסתא

424%

הכנסות מהאתר

לוגו קפה עלית

139%

מבקרים חדשים באתר

לוגו נקסט

258%

רכישות אורגניות

לוגו קפה עלית
139%

מבקרים חדשים

לוגו דייסון
189%

יחס המרה למודעות

לוגו איסתא
424%

הכנסות מהאתר

שיווק דיגיטלי שמביא תוצאות.