I know this is an older post I found it yesterday and had the same problem as you. Izk222 already bypassed the issue with a different technique but for this specific script:
The issue is that you need to run the same 'for loop' for web maps as you do the web apps. "matches" only contains a string of id numbers for the maps. It doesn't have a title, id, or type. Running the loop captures that data to send to the pandas data frame.
From the top for catching apps and web maps:
from arcgis.gis import GIS
import pandas as pd
# Log in to portal; prompts for PW automatically
gis = GIS('your portal url including https', 'your username')
# Layer ID to search for and its URL
find_id = 'layer id number'
find_url = gis.content.get(find_id).url
print(find_url)
# Pull list of all web maps in portal
webmaps = gis.content.search('', item_type='Web Map', max_items=-1)
# Return subset of map IDs which contain the service URL we're looking for
m_matches = [m.id for m in webmaps if str(m.get_data()).find(find_url) > -1]
# print web map ids that use this layer for sanity check
for i in m_matches:
print(i)
# create list to store target maps
map_list = []
for w in webmaps: # for every map in your portal
try:
# Get the JSON as a string
wdata = str(w.get_data())
criteria = [
wdata.find(find_url) > -1, # Check if URL is directly referenced
any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app
]
# If layer is referenced directly or indirectly, append app to list
if any(criteria):
map_list.append(w)
# Some apps don't have data, so we'll just skip them if they throw a TypeError
except:
continue
# Pull list of all web apps in portal
webapps = gis.content.search('', item_type='Application', max_items=-1)
app_matches = [a.id for a in webapps if str(a.get_data()).find(find_url) > -1]
# print web app ids that use this layer for sanity check
for i in app_matches:
print(i)
# Create empty list to populate with results
app_list = []
# Check each web app for matches
for w in webapps:
try:
# Get the JSON as a string
wdata = str(w.get_data())
criteria = [
wdata.find(find_url) > -1, # Check if URL is directly referenced
any([wdata.find(i) > -1 for i in matches]) # Check if any matching maps are in app
]
# If layer is referenced directly or indirectly, append app to list
if any(criteria):
app_list.append(w)
# Some apps don't have data, so we'll just skip them if they throw a TypeError
except:
continue
# display data
print('apps:')
pd.DataFrame([{'title':a.title, 'id':a.id, 'type':a.type} for a in app_list])
# display data
print('web maps:')
pd.DataFrame([{'title':m.title, 'id':m.id, 'type':m.type} for m in map_list])