Pregunta

En Google Sheets tengo una hoja con Respuestas del formulario y, a la derecha de las columnas del formulario, tengo columnas con fórmulas que usan datos del formulario para funciones.

Al principio, tenía las fórmulas extendidas hacia abajo en las filas para que funcionaran en envíos de formularios nuevos, pero descubrí que los envíos de formularios nuevos borrarían la fila :(.

En lugar de extender manualmente las fórmulas después de cada envío, instalé Andrew Stillman copyDown() guion;lo que hace es copiar las fórmulas después de enviar los scripts.

Ahora el problema que tengo es que el script funciona cuando se ejecuta manualmente, pero cuando lo configuro para activarlo en los envíos del formulario, copia dicha fórmula en esa hoja. y en todas las demás hojas de la hoja de cálculo.No quiero ese efecto secundario, ya que estropea toda la hoja de cálculo.:((

Lo que pensé hacer es editar el script para que solo funcione en una hoja de Respuesta del formulario, no en todas las hojas.Pero no sé cómo hacer eso.

El nombre de la hoja en la que quiero que se ejecute es "Solicitudes" y el gid=8.

¿Cómo edito este script para que solo funcione en esa hoja?

¿Fue útil?

Solución

Para que el código se ejecute solo en una hoja en particular, utilice el método .getSheetByName().Por ejemplo:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var reqSh = ss.getSheetByName('Requests');

Hay otra manera que podría ser más fácil.Puede intentar mantener una hoja exclusivamente para envíos de formularios y usar una fórmula de matriz en una segunda hoja para copiar cualquier valor de la primera hoja al mismo rango en la segunda.

=ARRAYFORMULA('Solicitudes'!A1:H) copiaría las columnas A a H.

Tuve el mismo problema que tú y esta fue la solución.Coloqué mis fórmulas en la segunda hoja en las columnas a la derecha del rango y las copié de la forma normal.Las fórmulas se referían al rango copiado en la segunda hoja.Funcionó de maravilla.

No se me ocurrió la idea; estoy seguro de que alguien la sugirió en el foro de hojas de cálculo de Google.Debería darte un enlace a la publicación pero acabo de buscar y no lo encuentro.

Otros consejos

En tu código tienes (comentarios en código)

 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();

Simplemente debe suprimir este bucle y utilizar sólo el número de hoja con el que desea continuar...

La forma más sencilla podría ser hacerlo así:

 var i = 8
 var sheets = ss.getSheets() [i];
 var cellAddresses = new Object();
    var range = sheets[i].getDataRange();
  ...

y al final del bucle elimine el } que se ajustaba al for bucle

EDITAR :el nuevo código debería ser así:

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]);
  }
//}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top