דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. עזרה בדיבוג - פונקצית UDF ל SHEETS (שפת JS)

עזרה בדיבוג - פונקצית UDF ל SHEETS (שפת JS)

מתוזמן נעוץ נעול הועבר תכנות
5 פוסטים 3 כותבים 167 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • Y.Excel.AccessY מנותק
    Y.Excel.AccessY מנותק
    Y.Excel.Access
    כתב ב נערך לאחרונה על ידי
    #1

    אני מנסה ליצור פונקציית 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 @ gmail.com

    יהודי טובי yossizY 2 תגובות תגובה אחרונה
    0
    • יהודי טובי מחובר
      יהודי טובי מחובר
      יהודי טוב
      השיב לY.Excel.Access ב נערך לאחרונה על ידי
      #2

      @Y-Excel-Access אמר בעזרה בדיבוג - פונקצית UDF ל SHEETS (שפת JS):

      ColumnsJoin.length / 2 != parseInt(ColumnsJoin.length / 2

      הערה צדדית.

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

      if (ColumnsJoin.length % 2 == 1)
      

      % מחזיר את ערך השארית בחילוק, ולכן במספר זוגי כשתחלק אותו ל2 השארית תמיד תהיה 0 (ללא שארית),
      ובמספר אי זוגי השארית תמיד תהיה 1

      Y.Excel.AccessY תגובה 1 תגובה אחרונה
      2
      • yossizY מנותק
        yossizY מנותק
        yossiz
        השיב לY.Excel.Access ב נערך לאחרונה על ידי
        #3

        @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]])

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

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        Y.Excel.AccessY תגובה 1 תגובה אחרונה
        4
        • Y.Excel.AccessY מנותק
          Y.Excel.AccessY מנותק
          Y.Excel.Access
          השיב לyossiz ב נערך לאחרונה על ידי
          #4

          @yossiz תודה רבה!
          כלומר אם אני מבין נכון, מתקבל טיפוס מערך של ROW ובתוכו COLUMN.
          והגישה היא כך:
          ARR[1][2] = VALUE;

          Y.Excel.Access @ gmail.com

          תגובה 1 תגובה אחרונה
          1
          • Y.Excel.AccessY מנותק
            Y.Excel.AccessY מנותק
            Y.Excel.Access
            השיב ליהודי טוב ב נערך לאחרונה על ידי Y.Excel.Access
            #5

            @יהודי-טוב נכון, תודה!

            • עריכה: דווקא אני צדקתי... כי יש אופציה שרוצים לעשות CROSS JOIN בלי לכתוב שום פרמטרים.
              ואז מספר ממשי לחלק ל2 יהיה שווה למספר שלם - שניהם שגיאה של חלוקה באפס.
              אני מקיף את זה ב TRY להבנה ברורה יותר...

            גם ראיתי בעיה נוספת - לא אתחלתי את מערך Cols עם אורכי העמודות של שתי ההפניות (אך לא יודע אם זה מעכב בJS... אני רגיל יותר לC# וכדו' שם זה לא עובר בשקט. ועכ"פ ודאי להבנה של הקוד זה חשוב)

            Y.Excel.Access @ gmail.com

            תגובה 1 תגובה אחרונה
            0
            • dovidD dovid העביר נושא זה מ-תכנות ב-

            בא תתחבר לדף היומי!
            • התחברות

            • אין לך חשבון עדיין? הרשמה

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