Google apps script 如何使用ImportRange编辑导入的Google工作表?
我使用Google apps script 如何使用ImportRange编辑导入的Google工作表?,google-apps-script,google-sheets,importrange,Google Apps Script,Google Sheets,Importrange,我使用=QUERY(IMPORTRANGE..)将A、B和C列的数据从表1导入到表2。我必须在表2的D列中记录导入的每个条目。但是,对于添加的任何新注释,D列中的注释(对于以前的注释)保留在相同的单元格中。例如,公式在A2中,因此新数据将添加到A2、B2和C2中。注释为D2。导入新的时,上一个将移动到A3、B3和C3。然而,注释仍在D2中 有没有办法让这些笔记在添加新条目时自动移动到下一行 以下是数据必须导入和导出的文件:如果注释是字符串,请尝试按如下方式放入D2: =数组公式(如果(第(A2:
=QUERY(IMPORTRANGE..)
将A、B和C列的数据从表1导入到表2。我必须在表2的D列中记录导入的每个条目。但是,对于添加的任何新注释,D列中的注释(对于以前的注释)保留在相同的单元格中。例如,公式在A2中,因此新数据将添加到A2、B2和C2中。注释为D2。导入新的时,上一个将移动到A3、B3和C3。然而,注释仍在D2中
有没有办法让这些笔记在添加新条目时自动移动到下一行
以下是数据必须导入和导出的文件:如果注释是字符串,请尝试按如下方式放入D2: =数组公式(如果(第(A2:A)行)=max(数组公式(如果(是空白的,第(A2:A)行),0,第(A2:A)行)),“您的注释”,和“”)
这将自动将您的备忘放在最后一行数据中如果我的理解正确,您希望完成以下操作:
- 使用
将数据从一个电子表格导入到另一个电子表格IMPORTRANGE
- 手动将注释添加到目标电子表格中的列中
- 将新行导入到目标电子表格并生成以前导入的数据时,注释也应移动
id
)来识别每一行,而不会产生歧义
在这一点上,我会考虑使用来满足你的需要。使用此工具,您可以开发=QUERY(IMPORTRANGE(…)
目前提供的功能,并且可以使用其他应用程序脚本工具来实现所需的结果。要实现这一点,可能需要两种工具:
- ,以跟踪不同电子表格的编辑时间,并在这种情况下进行适当的更改(基本上,将数据从一个电子表格复制到另一个电子表格)
- ,以存储有关哪个
附加到哪个数据行的信息注意
注释(在此代码示例中,在D列中,请根据您的偏好进行更改),该函数存储一个键值对,其中键是a列中的值(应唯一标识一行数据)而值
是注释
。这将在稍后用于脚本,以了解每个注释所属的位置:
columnsToDelete
)没有被复制/粘贴,您可以根据自己的首选项轻松地进行更改):函数copyData(e){
var范围=e范围;
var origin=range.getSheet();
var row=range.getRow();
如果(origin.getName()==“origin”&&row>1){//检查编辑的工作表是否称为“origin”,并且编辑的行是否不是标题。
var dest=SpreadsheetApp.openById(“您的目的地电子表格id”).getSheetByName(“目的地”);
var firstRow=2;
var-firstCol=1;
var numRows=origin.getLastRow()-1;
var numCols=origin.getLastColumn();
var values=origin.getRange(firstRow、firstCol、numRows、numCols).getValues();
//删除要复制/粘贴的某些列(在本例中为B和D):
var columnsToDelete=[1,3];
values=values.map(函数(行){
对于(var i=行长度;i>0;i--){
对于(var j=0;j1)dest.deleteRows(2,dest.getLastRow()-1);
var importedRange=dest.getRange(firstRowDest、firstColDest、numrowdest、numColsDest);
导入范围。设置值(值);
//将存储在属性中的注释写入相应行:
var properties=PropertiesService.getScriptProperties().getProperties();
对于(变量i=0;i
注:
- 如果希望所有这两个函数都使用属性,那么所有这些函数都应该在同一个脚本中
- 在本示例中,包含源数据的工作表称为
,复制该数据的工作表称为原始数据
(据我所知,它们位于不同的电子表格中)目标数据
- 在这个简化的示例中,源工作表中的A、B、E列被复制到th的A、B、C列
function storeNotes(e) { var scriptProperties = PropertiesService.getScriptProperties(); var cell = e.range; var sheet = cell.getSheet(); var rowIndex = cell.getRow(); var column = cell.getColumn(); var noteColumn = 4; // The column where notes are written, change accordingly // Check whether correct sheet, column and row is edited: if (column == noteColumn && rowIndex > 1 && sheet.getName() == "Destination") { var row = sheet.getRange(rowIndex, 1, 1, sheet.getLastColumn()).getValues()[0]; scriptProperties.setProperty(row[0], row[noteColumn - 1]); // Store property to script properties } }
function copyData(e) { var range = e.range; var origin = range.getSheet(); var row = range.getRow(); if (origin.getName() == "Origin" && row > 1) { // Check if edited sheet is called "Origin" and edited row is not a header. var dest = SpreadsheetApp.openById("your-destination-spreadsheet-id").getSheetByName("Destination"); var firstRow = 2; var firstCol = 1; var numRows = origin.getLastRow() - 1; var numCols = origin.getLastColumn(); var values = origin.getRange(firstRow, firstCol, numRows, numCols).getValues(); // Removing some of the columns to get copied/pasted (in this case B and D): var columnsToDelete = [1, 3]; values = values.map(function(row) { for (var i = row.length; i > 0; i--) { for (var j = 0; j < columnsToDelete.length; j++) { if (i == columnsToDelete[j]) { row.splice(i, 1); } } } return row; }) // Copying content from source to destination: var firstRowDest = 2; var firstColDest = 1; var numRowsDest = values.length; var numColsDest = values[0].length; var noteColumn = 4; var currentValues = dest.getDataRange().getValues(); if (currentValues.length > 1) dest.deleteRows(2, dest.getLastRow() - 1); var importedRange = dest.getRange(firstRowDest, firstColDest, numRowsDest, numColsDest); importedRange.setValues(values); // Writing notes stored in Properties in the appropriate rows: var properties = PropertiesService.getScriptProperties().getProperties(); for (var i = 0; i < values.length; i++) { for (var key in properties) { if (key == values[i][0]) { dest.getRange(i + 2, noteColumn).setValue(properties[key]) } } } } }