Измените сценарий copyDown() для работы только с одним листом.
-
11-12-2019 - |
Вопрос
В Google Sheets у меня есть лист с ответами формы, а справа от столбцов формы есть столбцы с формулами, которые используют данные формы для функций.
Вначале я расширил формулы вниз по строкам, чтобы они работали при отправке новых форм, но обнаружил, что новые отправки форм очищают строку :(.
Вместо того, чтобы вручную расширять формулы после каждой отправки, которую я установил Эндрю Стиллман copyDown()
сценарий;он копирует формулы после отправки сценариев.
Теперь проблема, с которой я столкнулся, заключается в том, что скрипт работает при запуске вручную, но когда я настраиваю запуск при отправке формы, он копирует указанную формулу на этот лист. и на всех остальных листах электронной таблицы.Мне не нужен этот побочный эффект, поскольку он портит всю таблицу.:((
Я решил отредактировать сценарий, чтобы он работал только с одним листом ответа на форму, а не со всеми листами.Но я не знаю, как это сделать.
Имя листа, на котором я хочу, чтобы он запускался, — «Запросы», а имя gid=8
.
Как мне отредактировать этот сценарий, чтобы он работал только для этого одного листа?
Решение
Чтобы получить код для запуска справедливого листа, используйте метод .getsheetByname ().Например:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var reqSh = ss.getSheetByName('Requests');
.
Есть другой способ, которым может быть проще.Вы можете попробовать сохранить один лист чисто для подачи формы и использовать ArrayFormula во втором листе для скопирования любых значений из первого листа в тот же диапазон во второй.
= ArrayFormula («запросы»! A1: H) будет копировать столбцы A на H.
У меня была та же проблема, что и вы, и это было решение.Я разместил свои формулы во втором листе в колоннах справа от диапазона и скопировал их нормально.Формулы сослались на скопированный диапазон во втором листе.Работало на угощение.
Я сам не придумал самостоятельно - я уверен, что он был предложен кем-то на форуме Google Formitshient.Я должен дать вам ссылку на сообщение, но я только что посмотрел, и я не могу его найти.
Другие советы
В вашем коде есть (комментарии в коде)
var sheets = ss.getSheets() [8]; // you choose sheet [8]
var cellAddresses = new Object();
for (var i=0; i<sheets.length; i++) { // but you enter a for loop that adresses every sheet in turn...
var range = sheets[i].getDataRange();
Вам следует просто подавить этот цикл и использовать только тот номер листа, который вы хотите продолжить...
Самый простой способ - сделать это следующим образом:
var i = 8
var sheets = ss.getSheets() [i];
var cellAddresses = new Object();
var range = sheets[i].getDataRange();
...
и в конце цикла удалите }, который соответствует for
петля
РЕДАКТИРОВАТЬ :новый код должен быть таким:
function copydown() {
setCopyDownUid();
setCopyDownSid();
logCopyDown();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets() [8];
var cellAddresses = new Object();
var i=8
// for (var i=0; i<sheets.length; i++) {
var range = sheets[i].getDataRange();
var lastRow = range.getLastRow();
var values = range.getValues();
for (var j=0; j<values.length; j++) {
for (var k=0; k<values[j].length; k++) {
var test = values[j][k].toString();
var start = test.indexOf("copydown");
if (start == 0) {
start = start+10;
var end = test.length-2;
var length = end-start;
var value = test.substr(start, length);
var col = k+1;
var nextRow = j+2;
var numRows = lastRow-(nextRow-1);
if (numRows>0) {
var destRange = sheets[i].getRange(nextRow, col, numRows, 1);
destRange.clear();
var newLastRow = sheets[i].getDataRange().getLastRow();
var newNumRows = newLastRow-(nextRow-1);
var newDestRange = sheets[i].getRange(nextRow, col, newNumRows, 1);
var cell = sheets[i].getRange(nextRow-1, col);
cell.setFormula(value);
cell.copyTo(newDestRange);
}
var cellAddress = cell.getA1Notation();
cellAddresses[cellAddress] = test;
}
}
}
Utilities.sleep(500);
resetCellValues(cellAddresses, sheets[i]);
}
//}