מהירות העבודה של גוגל סקריפט
-
האם יש דרך לשפר את מהירות העבודה של גוגל סקריפט (בתשלום)
-
@שמחה-זו-הסיסמא מה לאט לך שמה?
-
-
@שמחה-זו-הסיסמא מה עושה הפונקציה, משהו מורכב או משהו פשוט?
אם יש שמה למשל לולאה שמליון פעם בודקת אם A1 = 0 אז זה צפוי להיות לאט, אבל יש דרך קלה מאוד למהר את זה, לבדוק רק פעם אחת. הבנת את השאלה שלי? כל קוד איטי או יקר צריך לבחון אם יש דרך זולה יותר להשיג את המטרה. מה מטרת הקוד, מה הוא עושה? -
@dovid
הבנתי את השאלה שלך, אבל מדובר במגוון של דברים, ואני מחפש אפשרות אולי בתשלום שתמהר את הפעולה שלו, ולא לשכלל את הקוד שלי.
על אף שאני אבדוק גם את מה שאתה אומרמישהוא אמר לי שאולי עם google cloud זה אפשרי רק שאני לא יודע איך מתעסקים עם זה
-
@dovid אני כתבתי את הקוד המדובר
ולעניות דעתי אין בו קריאות מיותרות
יש קריאה אחת בהתחלה לקבל את כל הנתונים כמערך דו מימדי (ככה הם קוראים לזה), זה נצרך בגלל שהקוד מחפש שורה שעומדת בתנאים מסוימים
ובסיום יש קריאה נוספת לעדכון
האמת שבמקור עשיתי בבת אחת עדכון לכל השורה (כלומר getRange לכל השורה ואז setValues), כאשר היכן שאין מה לעדכן (לא נשלח ערך חדש עבור התא) מכניס את התוכן המקורי (שהתקבל בקריאה הראשונה),
ועכשיו שיניתי כך שיעדכן רק היכן שיש צורך, כך שזה במקום קריאה אחת לעדכון של כל השורה, יש בין 1 ל7 (תלוי בכמות התאים שמתעדכנים) קריאות קטנות כדי לעדכן כל תא, אבל מבדיקה שלי זה לא גורם לאיטיות, נראה שבאמת לוקח לסקריפט זמן לפעול
למעשה זה החלקים היחידים שמתקשרים עם השיטס:const sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName); const table = sheet.getDataRange().getValues(); בהתחלה, כאשר לא מדובר בגליון גדול
ואז לוגיקה די פשוטה של JS, ובסוףfor (const [i, call] of row.entries()) { if (call !== 'original-value') { sheet.getRange(rowIndex + 2, i + 1, 1, 1).setValue([call]); } } או:
sheet.deleteRow(rowIndex + 2);
-
@צדיק-תמים כלומר לא הסקריפט לוקח זמן אלא פשוט יש שיהוי בין הבקשה להפעלה?
-
@צדיק-תמים אמר במהירות העבודה של גוגל סקריפט:
למעשה זה החלקים היחידים שמתקשרים עם השיטס:
const sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheetByName(sheetName); const table = sheet.getDataRange().getValues(); בהתחלה, כאשר לא מדובר בגליון גדול
ואז לוגיקה די פשוטה של JS, ובסוףfor (const [i, call] of row.entries()) { if (call !== 'original-value') { sheet.getRange(rowIndex + 2, i + 1, 1, 1).setValue([call]); } } או:
sheet.deleteRow(rowIndex + 2);
לכאורה העניין הוא בשימוש ב for עם setValue ולא ב setValues אחד. כי הדבר הכבד כאן הוא הקריאה שוב ושוב לקובץ מקובץ הקוד החיצוני.
הרחבה - (איך להזין מערך ל SHEETS בקריאה אחת) - https://stackoverflow.com/questions/11495588/write-an-array-of-values-to-a-range-of-cells-in-a-spreadsheet -
@dovid אכן, אפילו במקרה שהבקשה נופלת מייד בתחילת הפונקציית doPost, בלי שום לוגיקה מורכבת או גישה לנתונים כמו שיסט.
לדוגמה אפילו קוד פשוט כזה:const secret = 'tgy4rugh84' function doPost(req) { if (req.parameter.secret !== secret) { return ContentService.createTextOutput( JSON.stringify({ error: 'Unauthorized', }) ).setMimeType(ContentService.MimeType.JSON); } return ContentService.createTextOutput( JSON.stringify({ message: 'OK', }) ).setMimeType(ContentService.MimeType.JSON); } לוקח לו להחזיר תשובה בין 0.9 ל1.5 שניות
-
@Y-Excel-Access @צדיק-תמים אמר במהירות העבודה של גוגל סקריפט:
האמת שבמקור עשיתי בבת אחת עדכון לכל השורה (כלומר getRange לכל השורה ואז setValues), כאשר היכן שאין מה לעדכן (לא נשלח ערך חדש עבור התא) מכניס את התוכן המקורי (שהתקבל בקריאה הראשונה),
ועכשיו שיניתי כך שיעדכן רק היכן שיש צורך, כך שזה במקום קריאה אחת לעדכון של כל השורה, בין 1 ל7 (תלוי בכמות התאים שמתעדכנים) קריאות קטנות כדי לעדכן כל תא, אבל מבדיקה שלי זה לא גורם לאיטיות,כלומר שאני מכיר את הצורה הנ"ל, ובמקרה הזה היא לא מתאימה (כיוון שישנם תאים עם נוסחאות, וה
getDataRange().getValues()
מקבל אותם כטקסט מקובע וממילא גם הsetValues בסוף מחזיר אותם כטקסט, ודורס את הנוסחה).
בכל מקרה כמו שכתבתי, אני לא חושב שעדכון של כל תא בשורה המסוימת בנפרד, במקום עדכון בבת אחת של כל ה1-7 תאים, הוא זה שגורם לאיטיות. הסקריפט אמור להתמודד בקלות עם כזה דבר. ראה גם מה שכתבתי בתגובה מעל -
@צדיק-תמים אמר במהירות העבודה של גוגל סקריפט:
אפילו קוד פשוט כזה לוקח לו להחזיר תשובה בין 0.9 ל1.5 שניות
האם אתה מתכוון גם באופן שהגליון ריק לגמרי מנתונים ונוסחאות?
-
@צדיק-תמים איך אפשר לדעת מהקוד מה מכיל הגיליון?
ההשערה שלי היא שגם נתונים ונוסחאות שקיימות בגיליון, גורמות להאטה בתהליך, אפילו בלי שהתהליך יגש לגליון. תבדוק את הקוד על גליון נקי. -
אולי להשתמש ב CacheService כדי לשפר את התגובות הבאות? זה לא בדיוק פותר את שורש הבעיה...
-
@OdedDvir לא רלוונטי במקרה הזה, הפעולה צריכה להיות על הנתונים בזמן אמת, כמו כן לאיטיות המובנית שהדגמתי כאן עם קוד פשוט של request => response בלי שום קבלת נתונים מרוחקים, זה לא יעזור.
אבל זה כלי שימושי לפעמים, תודה שהכרת לי אותו
עריכה - השתמשתי בו עכשיו למשהו שחסך לי הרבה קומבינות בדרכים שהכרתי... תודה!רק חבל שזה מוגבל לאלף רשומות...
-
@צדיק-תמים אמר במהירות העבודה של גוגל סקריפט:
@OdedDvir
0.9 - 1.5 שניות זה בלי שום גליון... בדיקה פשוטה של תנאי לוגי, והחזרת תשובה. תסתכל בקטע קוד שהבאתי.כל פעולה של APP SCRIPT המתקשרת עם SHEETS לוקחת כזה זמן, לא משנה כמה היא פשוטה. ואפילו מאקרו פשוט של 'כתוב ב A1 "אא" ' יקח לו כזה זמן.
-מה שאומר - לא יודע אם יש לזה פתרון אפשרי.
-
@Y-Excel-Access לא קראת מה שכתבו, אין בכלל התקשרות לsheet.
-
שמחה זו הסיסמאהשיב לY.Excel.Access ב 23 ביוני 2022, 18:28 נערך לאחרונה על ידי שמחה זו הסיסמא
@Y-Excel-Access
מה שאומר שאין לזה אולי פתרון אפשרי בכתיבת הקוד, אבל כן יתכן ויש לזה פיתרון אפשרי עם תשלום ל google שיקצו עבור זה יותר משאבים כדי שיקח פחות זמן
זו הייתה השאלה מתחילה ואולי מן הראוי להתמקד בדרך הזו אם יש מישהו שיכול לעזורושוב... תודה רבה מאוד לכל מי שמנסה לעזור
-
@שמחה-זו-הסיסמא לא מצאתי זכר בגוגל לתיעוד על האיטיות הזאת, אז קשה לי להאמין שיש תשלום שמסיר אותה.
אני גם חושב שלרוב השימושים הקלאסיים לא נוראה אם זה שניה או שלוש, כך שלדעתי הפתרון המסתמן זה פונקציית ענן שזה ממש דומה לapp script. -
@dovid
מה הכוונה פונקציית ענן ? -
@שמחה-זו-הסיסמא זה כמו לשאול על רגל אחת מה זה app script.
צריך לפתוח נושא על איך ואיפה וכמה עולה לכתוב פונקציית ענן שעושה XYZ (אני לא יודע מה הapp script של עושה). -
@dovid אני רק רציתי להבין מה פירוש המילים שלך
פונקציית ענן זה פלטפורמה מקבילה לapp script ? או שזה פונקציה לכתוב בapp script או משהו אחר ?בעיקרון המעלה הגדולה של app script היא האימות של גוגל שנעשית בצורה כמעט אוטומטית
משא"כ במקומות אחרים שזה מאוד מסובך לעשות אימות עם גוגל
פוסט 11 מתוך 23