在谷歌应用程序脚本的特定行范围内,将数据匹配从一张表复制到另一张表



这就是我想要做的:

我有一张名为";BD Visitas";。此工作表包含一些数据,这些数据稍后将成为我要复制到另一个工作表的数据。

我有一个称为";Ficha mascota";。该表包含一系列行,我想在其中粘贴来自源表的数据";BD Visitas";。

问题如下:

在目的页上;D18";上面写着宠物的名字。

取该单元格的值,在源表的B列中进行搜索";BD Visitas";并查找匹配的名称。

找到匹配的行后,获取最后15个匹配项。也就是说,从最后一行到第一行(从下到上(。

当您得到最后15个匹配的行时,复制列C、G、H、I(源工作表(并粘贴值​​在第39行至第53行的范围内,在目的页"的列C、D、G、M中;Ficha mascota";。

但是,它必须以相反的顺序复制,也就是说,源工作表的最后一个匹配项必须复制到目标工作表的第39行。源工作表的倒数第二个匹配项必须复制到目标工作表的第40行。因此,在目标纸张的行53中,将粘贴15个匹配范围内的第一个匹配。

我完成的工作如下:

function get15lastRowsBDvisitasToFichaMascota() {
const libro = SpreadsheetApp.getActiveSpreadsheet();
const hojaOrigen = libro.getSheetByName('BD visitas');
const hojaDestino = libro.getSheetByName('Ficha mascota');
// Rango destino
var rowsDestino = hojaDestino.getRange("C39:U53");
var rowsDestinoR = rowsDestino.getNumRows();
var rowsDestinoUF = rowsDestino.getLastRow();
// Coincidencia nombre mascota
var nombreVisor = hojaDestino.getRange('D18').getValue();
var tablaDeBusquedaNombre = hojaOrigen.getRange('B7:J').getValues();
var listaDeBusquedaNombre = tablaDeBusquedaNombre.map(function(row){return row[0]});
var busquedaNombre = listaDeBusquedaNombre.indexOf(nombreVisor);
var coincidenciaNombre = tablaDeBusquedaNombre[busquedaNombre][0];
var fechaVisita = tablaDeBusquedaNombre[busquedaNombre][1];
var motivoVisita = tablaDeBusquedaNombre[busquedaNombre][5];
var sintomasVisita = tablaDeBusquedaNombre[busquedaNombre][6];
var observacionesVisita = tablaDeBusquedaNombre[busquedaNombre][7];
// Rangos copia y pega
var obj = [
{ src: fechaVisita, dst: "C" + rowsDestinoUF }, // Fecha
{ src: motivoVisita, dst: "D" + rowsDestinoUF }, // Motivo
{ src: sintomasVisita, dst: "G" + rowsDestinoUF }, // Sintomas
{ src: observacionesVisita, dst: "M" + rowsDestinoUF }, // Observaciones
];
Logger.log(obj);
obj.forEach(({src, dst}) => hojaOrigen.getRange(src).copyTo(hojaDestino.getRange(dst), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false));  
}

但我被卡住了。我不知道如何调用将源工作表的固定行粘贴到目标工作表的行范围内。

我也不知道如何将行以相反的顺序粘贴到目标工作表上。

我是谷歌应用程序脚本和javascript的新手。在这几天里,我学到了很多,我已经能够做很多事情,然而,我的能力仍然有限,我错过了很多。

我们非常感谢您的帮助。非常感谢你。抱歉我英语不好。

您似乎正试图使用indexOf((搜索宠物名称,但这只会带来第一个匹配,据我所知,您最多需要15个匹配。

这样做的一种方法是:

  1. 遍历源工作表的行,并检查B列中的名称是否与目标工作表中单元格D18指定的名称匹配。由于您想按相反的顺序获取它们,您可以从最后一行开始向上,直到您得到所需的数字(15(,或者直到您检查了所有值
  2. 匹配时,可以从所需列中获取值,并将其存储在数组中
  3. 接下来,将这些值写入目标电子表格。由于目标列并不都是连续的,并且假设您不想删除范围中间的任何现有数据,因此在这种情况下,使用setValues((可能没有帮助。一种替代方法是使用setValue((逐个写入值,但这不是很有效。也许更好的方法是逐列写入值,因为行是连续的

以上可以这样实现:

function get15lastRowsBDvisitasToFichaMascota() {
const libro = SpreadsheetApp.getActiveSpreadsheet();
const hojaOrigen = libro.getSheetByName('BD visitas');
const hojaDestino = libro.getSheetByName('Ficha mascota');
// Rango destino
var rowsDestino = hojaDestino.getRange("C39:U53");
var rowsDestinoR = rowsDestino.getNumRows();
var rowsDestinoUF = rowsDestino.getLastRow();
// Coincidencia nombre mascota
var nombreVisor = hojaDestino.getRange('D18').getValue();
var tablaDeBusquedaNombre = hojaOrigen.getRange('B7:J' + hojaOrigen.getLastRow()).getValues();
var maxMascotas = 15;
var dadosMascotas = [];
for (var i = tablaDeBusquedaNombre.length - 1; dadosMascotas.length <= maxMascotas && i >= 0; i--) {
if (tablaDeBusquedaNombre[i][0] === nombreVisor) {
var fechaVisita = tablaDeBusquedaNombre[i][1];
var motivoVisita = tablaDeBusquedaNombre[i][5];
var sintomasVisita = tablaDeBusquedaNombre[i][6];
var observacionesVisita = tablaDeBusquedaNombre[i][7];
dadosMascotas.push([fechaVisita, motivoVisita, sintomasVisita, observacionesVisita]);
}
}
if (dadosMascotas.length === 0) {
return;
}
var hojaDestinoCols = ['C', 'D', 'G', 'M'];
var primeraRowDestino = rowsDestino.getRow()
for (var i = 0; i < hojaDestinoCols.length; i++) {
// Get the values per column
var colValues = dadosMascotas.map(function (row) { return [row[i]] });
// Write the column values starting from the first row of the destination range
hojaDestino.getRange(
hojaDestinoCols[i] + primeraRowDestino +
':' +
hojaDestinoCols[i] + (primeraRowDestino + dadosMascotas.length - 1))
.setValues(colValues);
}
}

相关内容

最新更新