Измените сценарий copyDown() для работы только с одним листом.

StackOverflow https://stackoverflow.com//questions/12659183

Вопрос

В 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]);
  }
//}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top