-
אני מנסה ליצור פונקציית UDF לבצע משני מערכים INNER JOIN. (כדי שיהיה אופציה של INNER JOIN כבסיס לפונקציית QUERY)
אני עדיין קצת חדש בJS, אז כתבתי את זה בפונקציות יותר פרימיטיביות = FOR רגיל, וכדו'.
כתבתי בSHEETS כך:
InnerJoin(C21:E26,A21:B25)
וזה נותן לי ערך שגיאה כזה:
TypeError: LeftRange.getNumRows is not a function (שורה ...).ואני לא מבין מה הבעיה - הרי הערכים הם אמורים להיות מטיפוס RANGE, ויש לאובייקט זה פונקציה כזו מפורש כאן
אשמח גם להערות נוספות, אבל עדיין לא הספקתי לדבג עד הסוף, ואני מנסה לשפר תוך כדי, אז לא רוצה להטריח לבינתיים...
הקוד שלי:
function InnerJoin(LeftRange,RightRange,...ColumnsJoin) { // בדיקת שגיאות if (ColumnsJoin.length / 2 != parseInt(ColumnsJoin.length / 2)){ throw "Expected a number parametrs is not Possible, (should be a couple)."; } for (var i=1;i<ColumnsJoin.length;i++){ if (typeof ColumnsJoin != "number"){ throw "Expected a number but got an input of another type."; } } // הצהרת משתנים var rows = []; var cols = []; var rowForReturn = true; // השמה if(ColumnsJoin.length === 0){ for(var rLeft = 1; rLeft <= LeftRange.getNumRows();rLeft++){ for(var rRight = 1; rRight <= RightRange.getNumRows();rRight++){ for(var i = 0 ; i < ColumnsJoin.length ; i++){ if(LeftRange.getcell(rLeft,i) != RightRange.getcell(rRight,i)){ rowForReturn = false; i = ColumnsJoin.length; } } if(rowForReturn){ for(var c = 1; c <= LeftRange.getNumColumns();c++){ cols[c] = LeftRange.getcell(rLeft,c); } for(var c = LeftRange.getNumColumns(); c <= LeftRange.getNumColumns() + RightRange.getNumColumns();c++){ cols[c] = LeftRange.getcell(rLeft,c); } rows.push(cols.slice()) } else{ rowForReturn = true; } } } } else{ for(var rLeft = 1; rLeft<=LeftRange.getNumRow();rLeft++){ for(var rRight = 1; rRight<=RightRange.getNumRow();rRight++){ for(var c = 1; c<=LeftRange.getNumColumns();c++){ cols[c] = LeftRange.getcell(rLeft,c); } for(var c = LeftRange.getNumColumns(); c<=LeftRange.getNumColumns()+RightRange.getNumColumns();c++){ cols[c] = LeftRange.getcell(rLeft,c); } rows.push(cols.slice()) } } } return rows; }
-
@Y-Excel-Access אמר בעזרה בדיבוג - פונקצית UDF ל SHEETS (שפת JS):
ColumnsJoin.length / 2 != parseInt(ColumnsJoin.length / 2
הערה צדדית.
אני חושב שיותר קריא לכתוב תנאי שיבדוק שהמספר זוגי בצורה כזו:
if (ColumnsJoin.length % 2 == 1)
% מחזיר את ערך השארית בחילוק, ולכן במספר זוגי כשתחלק אותו ל2 השארית תמיד תהיה 0 (ללא שארית),
ובמספר אי זוגי השארית תמיד תהיה 1 -
@Y-Excel-Access אמר בעזרה בדיבוג - פונקצית UDF ל SHEETS (שפת JS):
הרי הערכים הם אמורים להיות מטיפוס RANGE
לכאורה זה לא נכון.
ציטוט מהתיעוד:If you call your function with a reference to a range of cells as an argument (like =DOUBLE(A1:B10)), the argument will be a two-dimensional array of the cells' values. For example, in the screenshot below, the arguments in =DOUBLE(A1:B2) are interpreted by Apps Script as double([[1,3],[2,4]])
ובעברית: כאשר מעבירים טווח של תאים לפונקציה, הפונקציה מקבלת אותם כמערך של מערכים, כל מערך פנימי מייצג שורה אחת של הטווח
-
@יהודי-טוב נכון, תודה!
- עריכה: דווקא אני צדקתי... כי יש אופציה שרוצים לעשות CROSS JOIN בלי לכתוב שום פרמטרים.
ואז מספר ממשי לחלק ל2 יהיה שווה למספר שלם - שניהם שגיאה של חלוקה באפס.
אני מקיף את זה ב TRY להבנה ברורה יותר...
גם ראיתי בעיה נוספת - לא אתחלתי את מערך Cols עם אורכי העמודות של שתי ההפניות (אך לא יודע אם זה מעכב בJS... אני רגיל יותר לC# וכדו' שם זה לא עובר בשקט. ועכ"פ ודאי להבנה של הקוד זה חשוב)
- עריכה: דווקא אני צדקתי... כי יש אופציה שרוצים לעשות CROSS JOIN בלי לכתוב שום פרמטרים.
-