I coded an alternative to the agenda option in the accepted answer. The function below prompts for a date to change the scheduled date of any heading in the region with a scheduled date, with a default of 14 days, and only reschedules it if the item is not done and if the previous date is in the past (though you can change that easily):
;; package for string trimming and other string functions
(require 'subr-x)
;; Org annoyingly has a `org-scheduled-string` that is incompatible with `org-get-entry`
;; This variable fixes that
(defvar my-org-scheduled-string (car (split-string org-scheduled-string ":"))
"Org's scheduled string without the colon, e.g. 'SCHEDULED', for use with org-get-entry.")
(defun empty-string-p (string)
"Return true if the string is empty or nil. Expects string."
(or (null string)
(zerop (length (string-trim string)))))
(defun get-scheduled-timestring-at-point ()
"Returns whether the scheduled date of the heading at point is in the past."
(interactive)
(save-excursion
(org-back-to-heading)
(search-forward (concat org-scheduled-string " ")) ; move point to the scheduled entry
(buffer-substring (point) (line-end-position))))
(defun compute-days-to-present (timestamp-string)
"Computes the number of days from the trimestring until the present. Negative if the date is in the future."
(let* ((timestamp-list (org-parse-time-string timestamp-string))
(timestamp-start-of-day (append '(0 0 0) (slice timestamp-list 4 3)))
(timestamp-internal (apply #'encode-time timestamp-start-of-day))
(day-in-seconds (* 24 (* 60 60))))
(truncate (/ (float-time (time-subtract (current-time) timestamp-internal)) day-in-seconds))))
(defun is-scheduled-date-in-past ()
"Checks if the heading at point has a scheduled date in the past."
(let ((timestamp-string (get-scheduled-timestring-at-point)))
(< 0 (compute-days-to-present timestamp-string))))
(defun org-reschedule-heading-after-checks (time)
"Reschedule the heading at point with time if it has a scheduled date and is in the past."
(if (and (not (empty-string-p (org-entry-get nil my-org-scheduled-string)))
(is-scheduled-date-in-past)
(not (org-entry-is-done-p)))
(org-schedule nil time)))
(defun org-reschedule-region (time)
"Delays the headings in the region to the date provided (default +14d)."
(interactive "sPlease enter an Org delta (+14d, default) or a date (2019-11-27): ")
(save-excursion
(when (> (point) (mark))
(exchange-point-and-mark))
(let ((local-time (if (equal "" time) "+14d" time)))
(org-reschedule-heading-after-checks local-time)
(while (and (outline-next-heading)
(< (point) (mark)))
(org-reschedule-heading-after-checks local-time)))))
Then select a region and call with M-x org-reschedule-region
.
I prefer to reschedule items in a subtree. This function builds on the above and reschedules all headings in the subtree with a scheduled date:
(defun org-get-end-of-subtree ()
"Gets the index at the end of the subtree."
(save-excursion
(ignore-errors
(outline-end-of-subtree)
(point))))
(defun org-reschedule-subtree (time)
"Delays the heading at point to the date provided (default +14d), as well as any children with scheduled dates."
(interactive "sPlease enter an Org delta (+14d, default) or a date (2019-11-27): ")
(let ((end (org-get-end-of-subtree))
(local-time (if (equal "" time) "+14d" time)))
(when end
(save-excursion
(org-back-to-heading)
(org-reschedule-heading-after-checks local-time)
(while (and (outline-next-heading)
(< (point) end))
(org-reschedule-heading-after-checks local-time))))))