sheets sheet scripts script google getrange delete copyto apps app google-apps-script google-spreadsheet

google-apps-script - scripts - google apps script hide sheet



copiar datos en una hoja de otra basada en valores coincidentes (2)

Esto es un poco diferente a mi última pregunta, pero no puedo transferir el código para eso.

La hoja 1 tiene contactos individuales con el nombre de la empresa. Cada individuo tiene un nombre, pero el nombre de la compañía puede aparecer varias veces en función de la cantidad de personas en la hoja. Asi que:

Name Company Work Address John Smith ABC Company Jim Smith XYZ Company Bob Smith ABC Company

La hoja 2 tiene compañías con su dirección de trabajo:

Company Work Address ABC Company 1234 Street, USA XYZ Company 5678 Street, USA

¿Cómo hago un script para que las direcciones de la empresa vayan a la hoja de contacto individual?

Intenté usar matrices y buscar índices de filas / columnas, pero me falta algo. Este código me tiene más cerca, pero no puedo hacer que funcione (la columna de código y los números de fila no coinciden con la muestra, son solo las matrices actuales en las que estoy tratando de trabajar, fyi):

function populateCofieldsincontact() { var writeSheet = sskey.getSheetByName(''POCs''); var sourceSheet = sskey.getSheetByName(''Businesses''); var writeData = writeSheet.getRange(1, 6, writeSheet.getLastRow(), 5).getValues();Logger.log(writeData) for (var w = 0; w < writeData.length; w++ ) { var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues(); var dest = []; for (var i = 0; i < sourceData.length; i++ ) { if (writeData ==sourceData[i][0].toString().match(writeData)) { dest.push(sourceData[i][2]); } } } if (dest.length > 0 ) { writeSheet.getRange(2,10,dest.length,1).setValue(dest.toString()); } }

Cualquier ayuda muy apreciada!

actualización rápida - Puedo obtener setValue (no setValues ​​que no funcionarán por alguna razón) y escribir las direcciones en la columna correcta, pero solo la forma en que podría pensar para escribirlo en loop era usar getLastRow, y solo sé cómo hacer eso para la hoja. Así que terminé teniendo todas las direcciones en la columna correcta, pero escritas en filas comenzando en la parte inferior de donde están los datos reales. No puedo imaginar cómo escribir en la fila superior, luego hacia abajo, ugh.

Código FINAL (con suerte): inserté un [w][0] lado de la segunda mención de writeData en la línea 13 del código de writeData y parece estar funcionando después de algunas pruebas. Gracias @Adam y @Serge !!:

function populateCofieldsincontact() { var writeSheet = sskey.getSheetByName(''POCs''); var sourceSheet = sskey.getSheetByName(''Businesses''); var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues(); var sourceData = sourceSheet.getRange(2, 2, sourceSheet.getLastRow(), 12).getValues(); var dest = []; var temp; for (var w = 0; w < writeData.length; w++) { temp = null; for (var i = 0; i < sourceData.length; i++) { if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) { temp = sourceData[i][11]; break; } } dest.push([temp]); } if (dest.length > 0 ) { writeSheet.getRange(2, 13, dest.length, 1).setValues(dest); Logger.log(dest) } }


Debe usar dos bucles e iterar el segundo bucle en cada paso del primero. Si no se encuentra coincidencia en el segundo ciclo, debe insertar un elemento vacío en el primer conjunto para mantener la alineación de datos en la primera hoja de datos. Estoy seguro de que puedes pasar por esto ...


Vea si esto funciona como se espera, con suerte mis suposiciones sean correctas (edit: error tipográfico corregido según el comentario) :

function populateCofieldsincontact() { var writeSheet = sskey.getSheetByName(''POCs''); var sourceSheet = sskey.getSheetByName(''Businesses''); var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues(); var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues(); var dest = []; var temp; for (var w = 0; w < writeData.length; w++) { temp = null; for (var i = 0; i < sourceData.length; i++) { if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) { temp = sourceData[i][2]; break; } } dest.push([temp]); } if (dest.length > 0 ) { writeSheet.getRange(2, 10, dest.length, 1).setValues(dest); } }

Supongo que hay algunos problemas con el código, pero creo que el mensaje importante (que a un novato como yo le costó bastante) es que cuando usas getValues ​​y setValues, siempre tratas con arreglos bidimensionales, incluso si la matriz tiene solo una columna de ancho. De ahí los corchetes en el dest.push([temp]) : en realidad estás empujando progresivamente una matriz con una longitud de uno hacia la matriz de dest ina.