Ваш код копирует данные в одну и ту же строку каждый раз:
DS.getRange(row, 1, 1, DS.getMaxColumns()).copyTo(SS.getRange(8, 1, 1, DS.getMaxColumns()));
Чтобы получить код для записи данных в новые строки, вы можете изменить его на:
DS.getRange(row, 1, 1, DS.getMaxColumns()).copyTo(SS.getRange(8 + i, 1, 1, DS.getMaxColumns()));
Но это неэффективно, когда у вас есть большое количество результатов.Вы постоянно вызываете лист для записи каждой строки.
Было бы более эффективно сначала записать все результаты поиска в массив.А затем вызвать лист только один раз, чтобы записать все данные в строки за один раз.
function executeSearch() {
//establishing search sheet
var SSS = SpreadsheetApp.openById('ID');
var SS = SSS.getSheetByName('Sheet1');
var searchTerm = SS.getRange('B3').getValue();
//establishing the data sheet
var DS = SSS.getSheetByName('Sheet2');
var completeSearch = DS.createTextFinder(searchTerm).findAll();
var searchResults = []; // Create an array to store the values of the search results
for (var i = 0; i < completeSearch.length; i++) {
var range = completeSearch[i];
var row = range.getRow(); //get the rows that the search data is in
var values = DS.getRange(row, 1, 1, DS.getMaxColumns()).getValues();
searchResults.push(values[0]);
}
SS.getRange(8, 1, searchResults.length, searchResults[0].length).setValues(searchResults);
}
Единственное, на что следует обратить внимание в этом сценарии, это то, что он будет записывать значения на лист, а неформулы.