Generate Account User List - API, Power Query, Power BI, Dataflow

edited 04/25/24 in Show & Tell

Sharing the solution so you won't have to navigate the challenge I just conquered!

Need: Generate a list of the Smartsheet users WITHOUT having to download the report from the admin center.

Solution: Power Query

Assumptions: You're familiar with Power Query, Power BI, Dataflows, and how the PI works.


  1. Create a new Smartsheet data source connection in Power Query, select the Smartsheet.query function.
  2. Create a new blank query, go into advanced editor, use the following script:


  // Define the maximum number of records per page

  pageSize = 100,

  // Fetch the initial source to determine total count and total pages

  initialSource = #"Smartsheet Query"("users", "page=1", []),

  totalCount = initialSource[totalCount],

  totalPages = initialSource[totalPages],

  // Fields to check for null values and replace with appropriate values

  fieldsToCheck = {"sheetCount", "name", "email", "firstName", "lastName", "admin", "licensedSheetCreator", "groupAdmin", "resourceViewer"},

  // Function to apply null-replacement across specified fields in a record

  transformRecord = (record) =>


      existingFields = List.Intersect({Record.FieldNames(record), fieldsToCheck}),

      updatedFields = List.Transform(existingFields, each

        if _ = "sheetCount" then

          {_, if Record.Field(record, _) = null then 0 else Record.Field(record, _)}


          {_, if Record.Field(record, _) = null then null else Record.Field(record, _)}



      Record.ReorderFields(Record.Combine({record, Record.FromList(List.Transform(List.Difference(fieldsToCheck, existingFields), each if _ = "sheetCount" then 0 else null), List.Difference(fieldsToCheck, existingFields))}), fieldsToCheck),

  // Define a function to fetch data for a given page and apply the transformation

  fetchPage = (pageNum as number) as table =>


      delay = Function.InvokeAfter(()=> null, #duration(0,0,0,1)), // Add a delay of 1 second

      source = #"Smartsheet Query"("users", "page=" & Text.From(pageNum), []),

      data = source[data],

      transformedData = List.Transform(data, each transformRecord(_))


      Table.FromRecords(transformedData), // Convert the list of records into a table

  // Fetch all pages and combine into a single table

  allData = List.Accumulate({1..totalPages}, Table.FromRecords({}), (state, current) => Table.Combine({state, fetchPage(current)}))