web
You’re offline. This is a read only version of the page.
close
Skip to main content

Announcements

News and Announcements icon
Community site session details

Community site session details

Session Id :
Power Automate
Answered

Office Script issue

(0) ShareShare
ReportReport
Posted on by 40

Dear Community. 

Kindly assist a friend. I have a flow that needs to populate an excel sheet. I have visited the office script documentation page, watched @DamoBird365 video on youtube and wrote the script but the last line is underlining "ObjLineItemOut" whenever i mouse over, it shows this error that says  "office script cannot infer the data type of this variable. please declare a type for the variable." which i dont understand. Here is the code. The "Lineitemarray" that got passed as an argument is from my flow and the screenshoot is shown. Kindly assistLineitemarray.png

 

 

 

function main(workbook: ExcelScript.Workbook,
 StaffName:string,
 Total:string,
 Currency:string,
 Lineitemarray:string="[{}]"
 )
 {
 // your code here
 let sheet = workbook.getFirstWorksheet();

 //update variable pay sheet
 sheet.getRange("C6").setValue(StaffName);
 sheet.getRange("N6").setValue(Currency + Total);

 let ObjLineItemOut = JSON.parse(Lineitemarray);

 

 

Categories:
I have the same question (0)
  • DamoBird365 Profile Picture
    8,942 Microsoft Employee on at

    Hi @boyombo12 

     

    I was lucky enough to have the Excel team look at my script and I didn't initially get that error you mention, albeit i did in later release of Office Scripts.  You need to define the types for the items in the array.  If you take a look here https://github.com/DamoBird365/PowerAutomate/tree/main/ExcelInvoiceDemo you will be able to look at the excelscriptsv1 vs v2. 

     

    Below is v2

     

    function main(
     workbook: ExcelScript.Workbook,
     invoiceNumber: string,
     date: string,
     paymentMethod: string,
     chequeNo: string,
     jobNo: string,
     vatRate: number,
     customer: Customer,
     sales: Sales[],
    ) {
     // Get the first worksheet 
     const sheet = workbook.getFirstWorksheet();
    
    
     //Update Header of Sales Receipt 
     sheet.getRange("G2").setValue(invoiceNumber);
     sheet.getRange("G3").setValue(date);
     sheet.getRange("B9").setValue(paymentMethod);
     sheet.getRange("D9").setValue(chequeNo);
     sheet.getRange("E9").setValue(jobNo);
     sheet.getRange("G27").setValue(vatRate);
    
    
     //Update Customer Details
     const formattedCustomer = [[customer.name], [customer.companyName], [customer.street], [customer.city], [customer.phone]];
     sheet.getRange("C2:C6").setValues(formattedCustomer);
    
    
     //Update Sales Lines 
     const salesOffset = 12; //starting row for items on invoice 
     for (let i = 0; i < sales.length; i++) {
     const currentSales = sales[i];
     const formattedSales = [[currentSales.quantity, currentSales.itemNumber, currentSales.description, currentSales.unitPrice, currentSales.discount]];
     const saleCell = `B${salesOffset + i}:F${salesOffset + i}`;
     sheet.getRange(saleCell).setValues(formattedSales);
     }
    }
    
    
    interface Customer {
     name: string,
     companyName: string,
     street: string,
     city: string,
     phone: string,
    }
    
    
    interface Sales {
     quantity: number,
     itemNumber: string,
     description: string,
     unitPrice: number,
     discount: number,
    }

     

    Note that at the end of the script there is a definition for the Array variable as an interface.  If you provide this as part of the script file, it should then hopefully work as planned and PowerAutomate will enforce the types that you specify.

     

    The following video covers your scenario https://www.youtube.com/watch?v=Q7GLQnvJJF0

     

    You can jump to the key moment in the video here https://www.youtube.com/watch?v=Q7GLQnvJJF0&t=263

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
    Cheers,
    Damien


    P.S. take a look at my new blog here and like & subscribe to my YouTube Channel thanks 😉

  • boyombo12 Profile Picture
    40 on at

    Thanks for the response. I still have a challenge. i tried to reference my Lineitemarray as (lineitemarray: Lineitemarray[ ]) just like you did for your Sales array but it got underlined again. what connector did you use for you salaes array?? I would appreciate if you could share the flow screenshot.  I used the select connector for mine. Thanks 

  • DamoBird365 Profile Picture
    8,942 Microsoft Employee on at

    Hi @boyombo12 

     

    Try this - I am not a Typescript expert btw 😉 but the parse expression expects a string, you can pass the array direct to the office script.

     

    function main(workbook: ExcelScript.Workbook,
     StaffName: string,
     Total: string,
     Currency: string,
     Lineitemarray: Lineitemarray[]
    
    ) {
     // your code here
     let sheet = workbook.getFirstWorksheet();
    
     //update variable pay sheet
     sheet.getRange("C6").setValue(StaffName);
     sheet.getRange("N6").setValue(Currency + Total);
    
    }
    
    interface Lineitemarray {
     Month: string,
     InvNo: string,
     Client: string,
     Milestone: string,
     Role: string,
    }

     

    My flow looks like follows (and there is no reason you cannot use a Select):

     

    DamoBird365_0-1623305132546.png

     

    And after it runs, I get the following saved to Excel:

     

    DamoBird365_1-1623305167800.png

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
    Cheers,
    Damien


    P.S. take a look at my new blog here and like & subscribe to my YouTube Channel thanks 😉

     

  • boyombo12 Profile Picture
    40 on at

    Yours is working because your compose has a static data as the array. Mine is dynamic from get items value. here is the error message and my flow. I saw your message since but was doin a research myself to get it solved but all proved abortive.  

    typescript.pngselect connector.png

  • DamoBird365 Profile Picture
    8,942 Microsoft Employee on at

    @boyombo12 
    Have you defined an interface for your array?

     

    It doesn’t matter about my array being static, check my video and n excel invoicing. In this video I call the data dynamically and run the script 4 times in an apply to each.

     

    I believe your error relates to no array definition.

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
    Cheers,
    Damien


    P.S. take a look at my new blog here and like & subscribe to my YouTube Channel thanks 😉

  • boyombo12 Profile Picture
    40 on at

    I have gone through all your videos on this issue. i dont know what the problem is from my end. Here is my script and the flow. The script isnt showing any error but whenever i run my flow i get the error "We were unable to run the script. Please try again.
    Runtime error: Line 19: Cannot read property 'month' of undefined"  I have been on this for days. Im getting tired. 

     

    function main(workbook: ExcelScript.Workbook,
     StaffName: string,
     Total: string,
     Currency: string,
     lineItems: LineItemarray[]
    
    ) {
     // your code here
     let sheet = workbook.getFirstWorksheet();
    
     //update variable pay sheet
     sheet.getRange("C6").setValue(StaffName);
     sheet.getRange("M6").setValue(Currency + Total);
    
     const lineOffset = 8; //starting row for items on invoice 
    
     for (let i = 0; i <= lineItems.length; i++) {
     const currentLineitem = lineItems[i];
     const formattedLineItem = [[currentLineitem.month, currentLineitem.invoiceNumber, currentLineitem.clientName, currentLineitem.milestone, currentLineitem.role, currentLineitem.inflowReceived, currentLineitem.invoicedAmount, currentLineitem.vat, currentLineitem.netInflow, currentLineitem.variablePay, currentLineitem.wht, currentLineitem.netCreditedToAcct]];
     const lineCell = `A${lineOffset + i}:M${lineOffset + i}`;
     sheet.getRange(lineCell).setValues(formattedLineItem);
     }
    
    }
    interface LineItemarray {
     month: string,
     invoiceNumber: string,
     clientName: string,
     milestone: string,
     role: string,
     inflowReceived: string,
     invoicedAmount: string,
     vat: string,
     netInflow: string,
     variablePay: string,
     wht: string,
     netCreditedToAcct: string
    }
    

     

    Lineitem.pngerror.png

  • DamoBird365 Profile Picture
    8,942 Microsoft Employee on at

    @boyombo12 

     

    What does the history output of your lineitemarray select look like? 

    Damien

  • boyombo12 Profile Picture
    40 on at

    The Output body of the select returned 

     

    [
    {
    "month": "April",
    "invoiceNumber": "ED/INV/2/0024",
    "clientName": "clear code",
    "mileStone": "Second",
    "role": "Account Role",
    "inflowReceived": ".4,600,000",
    "invoicedAmount": "4,000,000.00",
    "vat": "300,000.00",
    "netInflow": "3,700,000.00",
    "variablePay": "97,680.00",
    "wht": "4,884.00",
    "netCreditedToAcct": "92,796.00"
    },
    {
    "month": "April",
    "invoiceNumber": "DJL/INV/2/0024",
    "clientName": "Eno",
    "mileStone": "Second",
    "role": "Account Role",
    "inflowReceived": ".5,000,000",
    "invoicedAmount": "4,000,000.00",
    "vat": "300,000.00",
    "netInflow": "3,700,000.00",
    "variablePay": "97,680.00",
    "wht": "4,884.00",
    "netCreditedToAcct": "92,796.00"
    }
    ]

  • Verified answer
    DamoBird365 Profile Picture
    8,942 Microsoft Employee on at

    Hi @boyombo12 

     

    I've spotted a few wee mistakes which should hopefully get you up and running - nearly there though - good effort 😉

     

    First thing is the key-value milestone, defined as milestone in the interface but mileStone in array.  Note the capital S.  If you adjust the script, you've got both the interface and for loop to update.

     

    Then the main error "Cannot read property 'month' of undefined".  This is caused by the for loop length.  The array key index starts from 0 and the length of your example is 2.  So it must be less than the length, not less than or equal as there will never be an index equal to length.  i=0 and 1 for length 2.

     

      for (let i = 0; i < lineItems.length; i++)

     

    Finally, your columns are A to L (not M).  This causes an error after you resolve the above.

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.
    Cheers,
    Damien


    P.S. take a look at my new blog here and like & subscribe to my YouTube Channel thanks 😉

  • boyombo12 Profile Picture
    40 on at

    I salute and appreciate you for your relentless effort to assist me. i almost gave up. When they say "Your head is there in Lagos Nigeria, it shows you are highly respected. Let me use this Medium to say Your head is there. 😁

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Introducing the 2026 Season 1 community Super Users

Congratulations to our 2026 Super Users!

Kudos to our 2025 Community Spotlight Honorees

Congratulations to our 2025 community superstars!

Congratulations to the March Top 10 Community Leaders!

These are the community rock stars!

Leaderboard > Power Automate

#1
Haque Profile Picture

Haque 605

#2
Valantis Profile Picture

Valantis 340

#3
11manish Profile Picture

11manish 284

Last 30 days Overall leaderboard