@חנון-המרבה הכוונת למשהו כזה - יצירת מודול באמצעות מאקרו
או להזרקת קוד?
Y.Excel.Access
-
מאקרו שכותב מאקרו אחר -
הסבר על פורום תכנות המצומצם@dovid תודה על המענה המהיר.
וכמובן תודה על ניהול הפורום הזה...נ.ב. בקשר אליך אישית, תבשר לי שפרצת כבר את תקרת שם הניק שלך.
לא הבנתי מה הכוונה...
-
הסבר על פורום תכנות המצומצםתגובה: הוראות הצטרפות לפורום התכנות (יש שינוי!)
ורקע אישי (שם, טלפון, והרקע בגללו אתם מעוניינים להצטרף. במידה וכבר יש לכם ידע, לספר עליו קצת).
למה צריך לכתוב רקע אישי בפורום תכנות המצומצם?
למה הוא נועד (למה לא פתוח לכולם וזהו)?
והאם הפרטים האישיים יוצגו לאחרים בפורום? ואם לא - האם גם האחראים מגלים לנו את פרטיהם האישיים?אשמח להבין איך זה עובד...
-
אשמח להמלצה - xlwings (הוספת פייתון באקסל/שיטס)אשמח להמלצה על תוסף קוד פתוח בשם xlwings, עבור הוספת קוד PITHON ב EXCEL וGOOGLE SHEETS. לפעולות מאקרו ופונקציות UDF.
(במקום APP SCRIPT ו VBA).
זה נוח ושימושי? -
ריצה בלופ מהאחרון לראשון בJS@dovid אמר בריצה בלופ מהאחרון לראשון בJS:
אולם במקרה שאתה עושה עדכון מניה למשתנה במהלך הלולאה אז הרבה יותר נכון להשתמש בלולאת for רגילה, זה אחת הלולאות הוותיקות ביותר ושוריאציה שלה נמצאת כמעט בכל שפת תכנות.
רציתי לציין עוד מעלה על דרך זו, שבלולאת FOR המשתנה i הרץ על פני הלולאה אינו מאוחסן במשתנה רגיל, אלא הוא מאוחסן במשתנה הקרוב פיזית למעבד. כך שהמהירות אמורה לעלות משמעותית, ובנוסף גם אין צורך לחפש את המשתנה לפי כתובתו כל פעם.
כך לפחות במעבדים של פון נוימן.משא"כ אם כותבים let a, ו ++a.
-
VLOOKUP עם ערך לחיפוש משתנה, אפשרי בלי IF?@OdedDvir מדהים! חידש לי ממש.
הערה חשובה:
לפחות לגרסאות היותר ישנות, לחישוב נכון של הנוסחה צריך להקיש בסיום כתיבת הנוסחה CTRL+SHIFT+ENTER לקבלת החישוב כנוסחת מערך. -
נוסחה בגוגל שיטס@בער לכאורה אפשר פשוט, להקצות עמודה בה ייכתב תאריך לטיפול.
במקום שאתה רוצה ש'יקפוץ' לך - לסנן לפי - אם התאריך של היום קטן או שווה ל'תאריך לטיפול' וגם לא שולם להראות את השורה.
ואם יש צורך למיין לפי תאריך (או לפי עמודה עמודה נוספת שתיצור בשם 'רמת חשיבות' וכד' כפי רמת היצירתיות שלך...)איך?
עם הפונקציה QUERY. -
נוסחה בגוגל שיטס@בער כתוב לי למטה - מתחת כל פוסט שאני כותב יש הערה עם הכתובת מייל
-
מענה במיילמענין לענין באותו ענין...
האם פורום תכנות הסגור הוא בתשלום? -
איך ליצור משתנה גלובלי ב Google sheets@dovid אמר באיך ליצור משתנה גלובלי ב Google sheets:
אולי אתה צריך את זה PropertiesService.
כן, זה נשמע בכיוון, תודה רבה.
אשמח לעוד קישור / חומר על זה למי שיש, עדיין לא ממש הבנתי איך לעבוד עם זה בפועל. -
איך ליצור משתנה גלובלי ב Google sheetsהקוד הסופי באקסל:
שדרוג אקסל - הוספת משתנים.xlsm
זה קובץ אקסל עם הקוד. (סופי עד השיפור הבא...)כמו שרואים כאן, הצבתי דוגמה שאני מחפש את המקסימום רק אם המינימום גדול מ 1.
אז לולא המשתנים הייתי אמור לחשב את המינימום פעמיים - אחד ל IF והשני למקרה שהוא באמת לא גדול מאחד, וכשהכלתי אותו בתוך משתנה חסכתי את זה.
כמובן זו רק דוגמה, כי החישובים יכולים להיות הרבה יותר מסובכים.
\אני מעתיק כאן את הקוד ישירות:
מודול קלאס בשם ArrayAsListOption Explicit Option Base 1 ' אמנם קבעתי כאן את אופציית ברירת המחדל של המערכים להתחיל ב 1, אך בפועל כשאתחלתי מחדש ' את המערכים המקומיים אתחלתי מ 0 כדי למנוע שגיאה בעת מחיקת הערך האחרון או מחיקת כל ערכי המערך ' אך באמת ההתייחסות המעשית למערך היא עדיין כמותחל ב 1 = לגבי הלולאות הרצות עליו ' כך יוצא שהערך 0 הוא ריק וחסר משמעות לקלאס זה Private MyArray() As Variant Private KeyMyArray() As String Private LengthMyArray As Integer Private Const LimitMaxCountValueInMyArray = 72 Public Sub Add(Value As Variant, Optional Key As String = "") Dim i As Integer For i = 1 To LengthMyArray If KeyMyArray(i) = Key Then MyArray(i) = Value: Exit Sub Next i If LengthMyArray < LimitMaxCountValueInMyArray Then ChangeLengthToMyArray 1 MyArray(LengthMyArray) = Value KeyMyArray(LengthMyArray) = Key End If End Sub Public Function Item(Optional Key As String = "") Dim i As Integer For i = 1 To LengthMyArray If KeyMyArray(i) = Key Then Item = MyArray(i): Exit Function Next i End Function Public Sub Remove(Optional Key As String = "") Dim i As Integer For i = 1 To LengthMyArray If KeyMyArray(i) = Key Then Dim j As Integer For j = LengthMyArray To i + 1 Step -1 MyArray(j - 1) = MyArray(j) KeyMyArray(j - 1) = KeyMyArray(j) Next j ChangeLengthToMyArray -1 Exit Sub End If Next i End Sub Public Sub RemoveAll() LengthMyArray = 0 ReDim MyArray(0 To LengthMyArray) ReDim KeyMyArray(0 To LengthMyArray) End Sub Public Property Get Length() As Variant Length = LengthMyArray End Property Private Sub ChangeLengthToMyArray(Optional StepForChange As Integer = 1) LengthMyArray = LengthMyArray + StepForChange ReDim Preserve MyArray(0 To LengthMyArray) ReDim Preserve KeyMyArray(0 To LengthMyArray) End Subוהפונקציות עצמם במודול רגיל:
Option Explicit Option Base 1 Public Function SubInFunction(ParamArray ReturnOnlyLest() As Variant) Dim temp As Variant For Each temp In ReturnOnlyLest SubInFunction = temp Next temp = StaticVars("Remove all temp") End Function Public Function SetVar(ByRef Value As Variant, Optional ByRef VarName As String = "") As Variant ' לכתוב למשתנה סטטי = ליצור משתנה או לערוך אותו ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל SetVar = StaticVars("Set", VarName, Value) End Function Public Function GetVar(Optional ByRef VarName As String = "") As Variant ' לקרוא ממשתנה סטטי = להחזיר את הערך שלו GetVar = StaticVars("Get", VarName) End Function Public Function RemoveVar(Optional ByRef VarName As String = "") As Variant ' למחוק משתנה סטטי ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל If VarName <> "All" Then RemoveVar = StaticVars("Remove", VarName) Else RemoveVar = StaticVars("Remove all") End If End Function Public Function SetTempVar(ByRef Value As Variant, Optional ByRef VarName As String = "") As Variant ' לכתוב למשתנה סטטי = ליצור משתנה או לערוך אותו ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל SetTempVar = StaticVars("Set temp", VarName, Value) End Function Public Function GetTempVar(Optional ByRef VarName As String = "") As Variant ' לקרוא ממשתנה סטטי = להחזיר את הערך שלו GetTempVar = StaticVars("Get temp", VarName) End Function Public Function RemoveTempVar(Optional ByRef VarName As String = "") As Variant ' למחוק משתנה סטטי ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל If VarName <> "All" Then RemoveTempVar = StaticVars("Remove temp", VarName) Else RemoveTempVar = StaticVars("Remove all temp") End If End Function Private Function StaticVars(Optional ByRef ActType As String = "Get", Optional ByRef VarName As String = "", Optional ByRef Value_ForSetOrForRemove As Variant = "") As Variant ' האחסון וכל הפעולות על משתנים סטטיים ' פונקציה זו היא לפעמים משמשת כשגרה ללא החזרת ערך (רק כך אפשר לעבוד בשפה זו עם משתנים סטטיים) Static Vars As New ArrayAsList Static TempVars As New ArrayAsList Select Case (ActType) Case "Get" StaticVars = Vars.Item(VarName) Case "Set" Vars.Add Value_ForSetOrForRemove, VarName StaticVars = 0 Case "Remove" Vars.Remove VarName StaticVars = 0 Case "Remove all" Vars.RemoveAll StaticVars = 0 Case "Get temp" StaticVars = TempVars.Item(VarName) Case "Set temp" TempVars.Add Value_ForSetOrForRemove, VarName StaticVars = 0 Case "Remove temp" TempVars.Remove VarName StaticVars = 0 Case "Remove all temp" TempVars.RemoveAll StaticVars = 0 End Select End Function(בכוונה אני עובר על המערך של PARAM ARRAY ולא מנסה להשיג את האורך שלו עם UBOUND ו LBOUND כי יש גרסאות באקסל שאין להם את הפונקציות האלו
גם - משום מה לא עובד על המערך בקלאס = NULL או = NOTHING אז ניסיתי להסתדר...
הפרמטרים של הפונקציות כולם BYREF בשביל המהירות בלבד. - אין טעם ליצור עוד משתנה (ואני יודע בשNET הקמפול מחשב את זה לבד... אבל בVBA כמדומני שלא.)) -
איך ליצור משתנה גלובלי ב Google sheetsאני מנסה ליצור משתנה גלובלי בפונקציה מותאמת אישית (UDF) בשיטס.
האפשרויות שמצאתי הם להשתמש ב CacheService כמו כאן:function GetOfVarGlobal(Key = "_") { var ValueGlobal = CacheService.getScriptCache(); return ValueGlobal.get(Key); }אבל זה רק STRING ואני צריך שיאחסן גם מערכים.
מה הצורך בדיוק?
בקידוד בSHEETS ואקסל יש הרבה פעמים צורך להקצות עמודות לערכי ביניים. אני מנסה להכניס אופציה של יצירת משתנים וכך להפוך את הגליון האלקטרוני ליותר דומה לשפת תכנות.
מה זה מועיל?- סדר, בעיקר. גם אפשרות לכתוב הערות.
- אופטימיזציה של מקום אחסון. לדוגמה בשיטס אפשר רק עד 2 מליון תאים, שזה עלול להגמר בחישובים מסובכים.
אשמח לדעת
- האם זה יעיל?
- והאם זה אפשרי.
תודה רבה.
מצרף כאן קוד שלי באקסל (באמצע פיתוח - עדיין לא עובד, אבל אפשר להבין את הכיוון. גם אני רוצה להחליף את הCollection במערכים עם ReDim).
אשמח להערות.Option Explicit Public Function SubInFunction(ParamArray ReturnOnlyLest() As Variant) Dim temp As Variant For Each temp In ReturnOnlyLest SubInFunction = temp Next temp = StaticVars("Remove all temp") End Function Public Function SetVar(Value As Variant, Optional Name As String = "") As Variant ' לכתוב למשתנה סטטי = ליצור משתנה או לערוך אותו ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל SetVar = StaticVars("Set", Name, Value) End Function Public Function GetVar(Optional Name As String = "") As Variant ' לקרוא ממשתנה סטטי = להחזיר את הערך שלו GetVar = StaticVars("Get", Name) End Function Public Function RemoveVar(Optional Name As String = "") As Variant ' למחוק משתנה סטטי ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל If Name <> "All" Then RemoveVar = StaticVars("Remove", Name) Else RemoveVar = StaticVars("Remove all") End If End Function Public Function SetTempVar(Value As Variant, Optional Name As String = "") As Variant ' לכתוב למשתנה סטטי = ליצור משתנה או לערוך אותו ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל SetTempVar = StaticVars("Set temp", Name, Value) End Function Public Function GetTempVar(Optional Name As String = "") As Variant ' לקרוא ממשתנה סטטי = להחזיר את הערך שלו GetTempVar = StaticVars("Get temp", Name) End Function Public Function RemoveTempVar(Optional Name As String = "") As Variant ' למחוק משתנה סטטי ' פעולה בלבד - נכתב כפונקציה רק כדי שיהיה אפשר להפעיל את זה דרך פונקציות אקסל If Name <> "All" Then RemoveTempVar = StaticVars("Remove temp", Name) Else RemoveTempVar = StaticVars("Remove all temp") End If End Function Private Function StaticVars(Optional ActType As String = "Get", Optional VarName As String = "", Optional Value_ForSetOrForRemove As Variant = "") As Variant ' האחסון וכל הפעולות על משתנים סטטיים ' פונקציה זו היא לפעמים משמשת כשגרה ללא החזרת ערך (רק כך אפשר לעבוד בשפה זו עם משתנים סטטיים) Static Vars As New Collection Static VarsName As New Collection Static TempVars As New Collection Static TempVarsName As New Collection Select Case (ActType) Case "Get" StaticVars = GetValueInCollectionOfName(VarName, Vars, VarsName) Case "Set" SetValueInCollectionOfName Value_ForSetOrForRemove, VarName, Vars, VarsName StaticVars = 0 Case "Get temp" StaticVars = GetValueInCollectionOfName(VarName, TempVars, TempVarsName) Case "Set temp" SetValueInCollectionOfName Value_ForSetOrForRemove, VarName, TempVars, TempVarsName StaticVars = 0 Case "Remove" RemoveValueInCollectionOfName VarName, Vars, VarsName StaticVars = 0 Case "Remove temp" RemoveValueInCollectionOfName VarName, TempVars, TempVarsName StaticVars = 0 Case "Remove all" RemoveAllValueInCollection Vars RemoveAllValueInCollection VarsName StaticVars = 0 Case "Remove all temp" RemoveAllValueInCollection TempVars RemoveAllValueInCollection TempVarsName StaticVars = 0 End Select End Function Private Function GetValueInCollectionOfName(NameValue As String, CollectionValues As Collection, CollectionNames As Collection) As Variant Dim i As Integer For i = 1 To CollectionNames.Count If CollectionNames(i) = NameValue Then GetValueInCollectionOfName = CollectionValues.Item(i): Exit Function Next i GetValueInCollectionOfName = 0 End Function Private Sub SetValueInCollectionOfName(Value As Variant, NameValue As String, CollectionValues As Collection, CollectionNames As Collection) Dim i As Integer For i = 1 To CollectionNames.Count If CollectionNames(i) = NameValue Then collection_ApdateValue CollectionValues, i, Value: Exit Sub Next i CollectionValues.Add Value CollectionNames.Add NameValue End Sub Private Sub RemoveValueInCollectionOfName(NameValue As String, CollectionValues As Collection, CollectionNames As Collection) Dim i As Integer For i = 1 To CollectionNames.Count If CollectionNames(i) = NameValue Then CollectionValues.Remove i: CollectionNames.Remove i: Exit Sub Next i End Sub Private Sub RemoveAllValueInCollection(MyCollection As Collection) Dim i As Integer For i = 1 To MyCollection.Count MyCollection.Remove i Next i End Sub Private Sub collection_ApdateValue(MyCollection As Collection, Index As Integer, NewValue As Variant) If MyCollection.Count = Index Then MyCollection.Add NewValue MyCollection.Remove Index Else MyCollection.Add NewValue, before:=Index + 1 MyCollection.Remove Index End If End Sub -
לאחר מפגש עם דודי (מתכנת בתעשייה האווירית) - פוסט פילוסופי: נבואה על עתידו של עולם התוכנה והמחשבים@ארכיטקט אמר בלאחר מפגש עם דודי (מתכנת בתעשייה האווירית) - פוסט פילוסופי: נבואה על עתידו של עולם התוכנה והמחשבים:
אז הבעיה הזו קיימת בכל העולם, בכל התעשיות, בכל הצבאות, שאף אחד לא יבלבל לי במוח. למטוס F35 יש 25 מיליון שורות קוד, יש מכשירים אזרחיים שיש בהם מעל 100 מיליון שורות קוד, אין שום סיכוי שהדבר הזה בר תחזוקה ובר ידיעה של בן תמותה. הבאגים נוצרים במימשקים, ואז מישהו צריך לדבר עם מישהו שצריך לדבר עם עוד מישהו, חלאס עם ההזיות שזה יעבוד. בינתיים כפי טבעו של העכברוש הוא מנצל את הכסף שמוזרם לתעשיות הללו, לוקחים משכורת ורווחים הביתה, ומשאירים את שברי הכלים לדורות הבאים, מתוך הנחה שהכסף הרב שנצבר יוכל "לפתור כל בעיה" הוא לא! כשאין אנשים שיתחזקו את התוכנות, כסף לא יוכל לייצר אותם נקודה.
באמת בתחום החומרה צורת בדיקת הבאגים היא על ידי משוואות מתמטיות, כך שכמות הבאגים קטנה מאוד. הסיבה שבתחום התכנות זה לא כך, כי החומרה יקרה, אבל התוכנית לא.
במידה והמפלצת המדוברת תשתחרר, המקסימום שיקרה שליישומים שאין בהם סובלנות לבאגים כמו התעשייה האווירית הנ''ל יצטרכו 'להמציא את הגלגל מחדש' ולבנות הכל כמו בחומרה - עם משוואות מתמטיות לכל תוכנית.באמת SAP היא ממשק לארגונים הכי גדולים, והם מה זה מרובעים... (ניהול תפקידי צוות מאוד קשוח ומסודר), וגם APAP (השפת SERVER של SAP) מאוד פשוטה ובטוחה. אבל כמובן גם הם עדיין לא עברו לבדיקות כאלה יסודיות לפי הידוע לי.
-
מהירות העבודה של גוגל סקריפט@צדיק-תמים אמר במהירות העבודה של גוגל סקריפט:
@OdedDvir
0.9 - 1.5 שניות זה בלי שום גליון... בדיקה פשוטה של תנאי לוגי, והחזרת תשובה. תסתכל בקטע קוד שהבאתי.כל פעולה של APP SCRIPT המתקשרת עם SHEETS לוקחת כזה זמן, לא משנה כמה היא פשוטה. ואפילו מאקרו פשוט של 'כתוב ב A1 "אא" ' יקח לו כזה זמן.
-מה שאומר - לא יודע אם יש לזה פתרון אפשרי.
-
מהירות העבודה של גוגל סקריפט@צדיק-תמים אמר במהירות העבודה של גוגל סקריפט:
למעשה זה החלקים היחידים שמתקשרים עם השיטס:
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 -
לאחר מפגש עם דודי (מתכנת בתעשייה האווירית) - פוסט פילוסופי: נבואה על עתידו של עולם התוכנה והמחשביםלגבי הטעויות - היקף הידע:
לא מסכים...
לפי זה היה צריך להיות שפייתון לא תהיה קיימת ולא פופולרית, כי היא שפה מפורשת, ומרווח הטעויות שם הרבה יותר גדול מהשפות ה'ישנות'.
ודאי זה לא עכשוי - עם כל הוויכוח הגדול בין OOP לשפות פונקציונליות (הנחשבות יותר בטוחות), עדיין לא נראית דעיכה ב OOP... וכולנו כותבים JS למרות שהיא מזעזעת מבחינת טעויות.אני מאמין שיצטרכו לעשות שפות יותר מאורגנות - RUST, V, GO, ELIXIR ועוד הם שפות חדשות שנכתבו גם על מנת לצמצם באגים.
בדבר אחד יש ממש התקדמות - הטכנולוגיה שמגלה או מתקנת טעויות -
- הקומפיילרים ובודקי הטעויות שבסביבות העבודה (מי שמכיר את VISUAL STUDIO בגרסאות יותר ישנות מרגיש הבדל מהותי...),
- האופטימליות בקמפול הקוד - כך שגם אם נכתב קוד זבל הוא קצת מתוקן... מייקוסופט הודיעו שהם 'עדיין לא' הצליחו לשפר את האלגוריתמים של המשתמשים ב NET.
- וכמובן - הקוד הרב הקיים דווקא מפשט את התהליך. וכנראה ככל שיהיו יותר פרוייקטים עם באגים מהותיים ותחומים שלא סובלניים לבאגים נראה גם צמיחה של קוד בטוח יותר. וכשקוד נוסה כבר קל יותר לתכנת איתו - נדרשים באמת פחות שורות קוד. (כמו שאם תנסה ליצור פורמס חדשים יהיה לך יותר באגים מאשר להשתמש ב C# WINFORM
לגבי טבע האדם והדופמין:
הלוואי שאתה צודק, אבל נראה לי שהכיוון דווקא הפוך.
ואם כן יהיה כדבריך, לא נראה דעיכה בעולם התוכנה אלא צורה אחרת של תוכנות - יותר עוזרות פיזית / מידע חיוני, ופחות בילויים (אינטרנט חסום לכולם... :))ונקווה שהמשיח כבר יבוא ויתקן את העולם לשימוש נכון בכל הטכנולוגיה הזו...
-
שגיאה בפונקציית פילטר בגוגל שיטס@שמחה-זו-הסיסמא אמר בשגיאה בפונקציית פילטר בגוגל שיטס:
@OdedDvir
אני מקווה שהבנתיישנם פונקציות היכולות להחזיר טווח ולשמש כפונקציות מערך (בתוך ARRAYFORMULA), וישנן פונקציות שלא.
דוגמא לפונקציות שלא:- TEXTJOIN
- AND
- OR
פונקציות אלו תמיד יחזירו ערך בודד, כך שאי אפשר להשתמש בהם כלל בתוך פונקציית מערך כי הם יכשילו את המערך ויחייבו אותו להחזיר ערך יחיד.
נ.ב. אני מאמין שאפשר ליצור אותם כמחזירי טווח בפונקציות UDF או למצוא קוד קיים... אבל לצערי אני עדיין לא מכיר.
-
רעיון לעריכת טבלא בגוגל שיטס@Y-Excel-Access אמר ברעיון לעריכת טבלא בגוגל שיטס:
@שואף אמר ברעיון לעריכת טבלא בגוגל שיטס:
מחפש רעיון, בלי יותר מידי פיתוח, שיהיה איכשהו אפשר לבחור שורה וזה יפתח טופס עם השמות של השדות, ויהיה אפשר לערוך את הנתונים, ואז ללחוץ אישור וזה יסגור את הטופס ויעדכן את השורה.
מכירים כזה דבר?
תודהכן, GOOGLE FORMS.
ולהכין אותו מראש בתשובה אוטמטית לפי השורה הקיימת, כמו שמפורט כאן https://tchumim.com/topic/13268/איך-למלא-forms-מראש-על-ידי-נוסחה-באקסל-נוסח-קישור/3אני מבין שהצורך יהיה גם לעדכן לפעמים דרך הSHEETS וגם דרך הטופס, אז ההסבר לקמיה הוא לפי זה.
אפשרות שניה - הקלדה ישירה דרך GOOGLE SCRIPT:
-
לכתוב מספר שורה (=ARRAYFORMULA(ROW(A:A))) ללא הדבקה כערכים.
-
להוסיף את העמודה של הקישור הממולא מראש כנ"ל במיקום נוח בטבלה.
-
ליצור טריגר שבהגשת טופס תפעל פונקצית GOOGLE SCRIPT. - לפונקציה זו לכתוב פרמטר (נקרא לו Event) שילכוד את הטופס החדש.
-
והפונקציה תכתוב את כל נתוני הטופס בטבלה לפי המספר שורה המופיע בטופס. (צריך קודם לבחור בגליון הנכון, ואז להגדיר עמודה עמודה לפי כותרת)
-
חשוב מאוד באפשרות זו לעשות הרבה IF ו TRY לבדוק שאין באג - שלא נוספה או הוחלפה עמודה בטעות וכו'
איזו אפשרות עדיפה?
לי נוח יותר האפשרות הראשונה, למרות שהיא מצריכה לבנות עוד טבלה וצריך להגן על העמודה של המזהה, מ"מ יש תיעוד קל ונוח של כל הטפסים והעריכות, ויש הבדלה ברורה למשתמש (גם המתכנת הוא משתמש :)) בין מקום ששייך בו עריכה למקום שלא, כי זה בטבלה נפרדת. -
-
רעיון לעריכת טבלא בגוגל שיטס@שואף אמר ברעיון לעריכת טבלא בגוגל שיטס:
מחפש רעיון, בלי יותר מידי פיתוח, שיהיה איכשהו אפשר לבחור שורה וזה יפתח טופס עם השמות של השדות, ויהיה אפשר לערוך את הנתונים, ואז ללחוץ אישור וזה יסגור את הטופס ויעדכן את השורה.
מכירים כזה דבר?
תודהכן, GOOGLE FORMS.
ולהכין אותו מראש בתשובה אוטמטית לפי השורה הקיימת, כמו שמפורט כאן https://tchumim.com/topic/13268/איך-למלא-forms-מראש-על-ידי-נוסחה-באקסל-נוסח-קישור/3אני מבין שהצורך יהיה גם לעדכן לפעמים דרך הSHEETS וגם דרך הטופס, אז ההסבר לקמיה הוא לפי זה.
איך בדיוק הנתונים יעודכנו על ידי מילוי הטופס?
ליצור מזהה - מספר שורה (=ARRAYFORMULA(ROW(A:A))), להעתיק ולהדביק כערכים (שלא ישתנה כל הזמן המזהה לפי מחיקת שורות). ולהגן על עמודה זו מפני עריכה עתידית.
לחלק ל 3 גליונות: גליון של הוספה ידנית (מה שעבדת איתו עד עכשיו, הכולל את העמודת המזהה החדשה), גליון של תגובות הטופס, וגליון שלישי = כל התצוגה שעובדים איתה. התצוגה עצמה תהיה רק פונקצייה אחת - פונקציית QUERY המאחדת בין הנתונים הכתובים ידנית לנתונים הכתובים דרך הטופס לפי המזהה - מספר שורה,איך לכתוב את פונקציית QUERY - החלק הראשון (הבסיס): הפניה לגליון נתונים ידניים UNION הפניה לגליון תגובות מהטופס ( UNION מתבצע על ידי { ; } ).
בחלק השני לכתוב את משפט הSQL שלה: WHERE מספר שורה <> "", GROUP BY לפי מספר שורה, וכל הנתונים LAST.
ו - כמובן ORDER BY לפי מספר שורה.הקישור לטופס:
בגליון תצוגה ליד כל הנתונים - במקום נוח (בהתחלה או בסוף העמודות) ליצור פונקציית מערך של HYPERLINK עם השרשור כמו שמפורט בקישור שהבאתי (כך שייוצרו קישורים לטופס ממולא מראש על פני כל הטבלה, כל שורה לפי הנתונים בשורה שלה),
כך שבלחיצה על הקישור בשורה שצריכה עריכה הטופס ייטען עם המזהה - המספר שורה ועם כל שאר הנתונים בשורה זו.מקווה שהייתי מספיק מובן...
במקרה שרוצים להשאיר אופציה...(מחקתי).
אם רוצים להוסיף שורה בין השורות, תמיד אפשר לכתוב במספר שורה + שבר.
לדוגמא בין 12 ל 13 לכתוב 12.1, 12.2 וכו', ופשוט.