Find Hiring Companies: Scrape Job Listings to Google Sheets
Pull Indeed, LinkedIn, Glassdoor and ZipRecruiter job listings into Google Sheets with INDEEDJOBS and JOBSEARCH, then turn the companies that are hiring into a prospect list or a salary benchmark. Filters, columns and credit costs.
Phil Nguyen · 6 min read

To scrape Indeed jobs into Google Sheets, type =INDEEDJOBS("data analyst", "Chicago, IL", "US", 20) in a cell and SheetMagic writes the listings into a results tab. To search LinkedIn, Indeed, Glassdoor, ZipRecruiter and other job boards in one go, use =JOBSEARCH("data analyst", "US", "Chicago, IL", "fulltime", FALSE, 30) instead, which adds salary range columns and the board each listing came from. Every listing is a company with an open role right now, which makes the results a prospect list for sales and a salary benchmark for hiring.
Say you sell software to sales teams and want companies hiring sales reps. Searching the boards and copying the company, title and location of each listing takes about 2 minutes a listing, so 30 listings is an hour. One JOBSEARCH formula returns 30 listings for 430 scraping credits.
Both functions are part of the SheetMagic add-on and run the same way as its other scraper formulas. If you are new to scraping in Sheets, start with the web scraping guide.
INDEEDJOBS or JOBSEARCH: which should I use?
Use INDEEDJOBS when you only care about Indeed. Its arguments are position, location, country and maxResults, and it returns up to 20 listings when you leave maxResults empty.
Use JOBSEARCH when you want coverage across boards. It searches 39 job boards, including LinkedIn, Indeed, Naukri.com, ZipRecruiter, Glassdoor, Stepstone, Reed.co.uk and USAJOBS. Its arguments are keyword, country, location, job_type, remote_only and maxResults, and maxResults defaults to 30.
One thing to know about JOBSEARCH: maxResults is shared across the boards, not applied to each one. SheetMagic divides your number by the number of boards searched and asks each board for that share, rounded up, with a minimum of one listing per board. A small maxResults still asks every board for at least one listing.
How do I filter by location, country, job type and remote?
Location is free text in both functions, such as "New York, NY" or "Austin, TX". Leave it empty to search the whole country. In JOBSEARCH the location filter is best effort, so listings from nearby areas can appear.
Country takes a two-letter code. INDEEDJOBS uses it to pick the Indeed country site ("US", "GB", "CA", "DE" and so on) and defaults to "US". JOBSEARCH converts a two-letter code like "US" or "UK" into the full country name the job boards expect, and also accepts the full name. It defaults to United States.
Job type is a JOBSEARCH argument with five values: "all", "fulltime", "parttime", "internship" and "contract". It defaults to "all".
Remote is the remote_only argument in JOBSEARCH. Set it to TRUE to keep only remote-friendly roles. The default, FALSE, returns remote and on-site roles together.
INDEEDJOBS has no job type, date posted or salary filter. Filter the Job Type, Posting Date or Salary column in the sheet instead.
What columns come back?
INDEEDJOBS writes these columns: Title, Company, Location, Salary, Job Type, Listing Age, Description, URL, Company Indeed Page, Posting Date, Expired, Company Rating and Company Review Count, followed by Company Description, Company Website, Company Logo and Company Size. Those last four stay empty from the formula, because INDEEDJOBS does not ask Indeed for company details. Listing Age is Indeed's relative text, such as "3 days ago", while Posting Date is the calendar date.
JOBSEARCH writes: Title, Company, Location, Remote, Job Type, Posted, Platform, Salary Min, Salary Max, Salary Currency, Salary Period, Industry, Company Size, Company Website, Company Description, Job URL, Apply URL, Description, Company Address, Company Revenue, Company URL, Job Level and Job Function. The Platform column tells you which board each row came from. Job URL points to the listing on that board, and Apply URL holds the listing's official link when the board reports one.
Long text is trimmed so rows stay readable: the Description column is cut to 500 characters in both functions, and the JOBSEARCH Company Description column is cut to 300.
What does a job scrape cost?
Job scrapes use scraping credits. INDEEDJOBS costs 20 credits per listing returned. JOBSEARCH costs 13 credits per listing plus 40 credits per run.
You pay for the rows you get, not the rows you asked for, and a run never writes more rows than your maxResults. A run that finds nothing costs 0 credits. As a worked example, a JOBSEARCH run that returns 30 listings costs 40 + (30 x 13) = 430 credits, and an INDEEDJOBS run that returns 20 listings costs 20 x 20 = 400 credits.
What can you do with the job listings?
- Pitch companies while they are spending. A company hiring for a role is often buying the tools that role uses. The Company, Company Website, Industry and Company Size columns are the start of a prospect list, built in the example below.
- Set a salary that does not lose candidates. JOBSEARCH returns Salary Min, Salary Max, Salary Currency and Salary Period where the board reports them. Before you post a role, sort 30 similar listings by Salary Max to see what you are competing with, instead of learning it from offers that get turned down.
- Find clients for a recruiting agency. Search the roles you place. Every company in the Company column has an open seat today.
Where do the results go?
Job scrapes run in the background. The cell shows ⏳ Scraping... right away, and the listings are written to a new tab: Indeed Scraper Results for INDEEDJOBS and Jobs Scraper Results for JOBSEARCH. The first column, Source, holds the address of the formula cell. With Keep Formula on, which is the default, the formula cell then keeps your formula frozen as text; with it off, the cell changes to a status naming the tab.
Example: a hiring-signal lead list for sales
A company that is hiring for a role is often buying the tools that role uses. Here is how a sales team can turn job posts into a prospect list:
- In an empty cell, enter
=JOBSEARCH("sales development representative", "US", "Austin, TX", "fulltime", FALSE, 60). - Wait for the Jobs Scraper Results tab to fill. Each row has the Company, Company Website, Industry and Company Size of the employer.
- Filter Company Size and Industry to your ideal customer profile, then remove duplicate companies.
- Add contacts and emails for each company with the steps in how to enrich a lead list in Google Sheets.
For more prospecting workflows, see the sales lead generation guide.
Text and scraping formulas run on the free allowance. Install from the Google Workspace Marketplace, no card, no expiry.
Install free for Google SheetsAbout the author
Phil NguyenPhil builds SheetMagic, the Google Sheets add-on that brings AI and web scraping into the spreadsheet, used by 6,300+ people. He writes these guides from the formulas he runs on his own sheets.
