我有两张纸;一个是由许多人编辑的母版纸,另一个是使用IMPORTRANGE的母版纸的副本,其中我的团队在IMPORTRANGE数据旁边的列中做笔记。这遭受了一个古老的问题,即当有人在主数据上删除或插入一行时,第二张纸上的数据将对齐。
我有一个名为Test Main Data的母版纸和一个名为Test Data Script的测试纸。
关于Synchronize independent spreadsheet rows, filled by IMPORTRANGE()询问的@sam,我使用了@Mogsdad提供的答案中的代码将自己的工作表链接在一起。但是,我并不是真的很精通JavaScript(或者任何一种语言,我只参加过编程入门),所以我不确定如何使它适用于我的工作表。
var sheetId2 = '1FeRbdGFoPL4MdJix9AvW50i4oEMqAuVxCewJLykxI-g';
/**
* Call syncTables() with the name of a key column.
*/
function doSyncTables() {
syncTables( "Name" );
}
/*
* Sync "Orders" spreadsheet with imported rows from "Items" spreadsheet.
*
* From: http://stackoverflow.com/a/33172975/1677912
*
* @param {String} keyName Column header used as key colum, appears
* at start of "Orders" data, following
* "Items" data.
*/
function syncTables( keyName ) {
var sheet2 = SpreadsheetApp.openById( sheetId2 ).getSheetByName('Notes');
// Get data
var lastCol = sheet2.getLastColumn();
var lastRow = sheet2.getLastRow(); // Includes all rows, even blank, because of =importRange()
var headers = sheet2.getRange(1, 1, 1, lastCol).getValues()[0];
var keyCol = headers.lastIndexOf( keyName ) + 1;
var itemKeys = sheet2.getSheetValues(1, 1, lastRow, 1).map(function(row) {return row[0]});
var itemData = sheet2.getSheetValues(1, 1, lastRow, keyCol-1);
var orderData = sheet2.getSheetValues(1, keyCol, lastRow, lastCol-keyCol+1);
var ordersByKey = []; // To keep track of orders by key
// Scan keys in orderData
for (var row=1; row<orderData.length; row++) {
// break loop if we've run out of data.
var orderKey = orderData[row][0];
if (orderKey === '') break;
ordersByKey[ orderKey ] = orderData.slice(row, row+1)[0];
var orderKey = orderData[row][0];
}
var newOrderData = []; // To store reordered rows
// Reconcile with Items, fill out array of matching orders
for (row = 1; row<itemData.length; row++) {
// break loop if we've run out of data.
var itemKey = itemData[row][0];
if (itemKey === '') break;
// With each item row, match existing order data, or add new
if (ordersByKey.hasOwnProperty(itemKey)) {
// There is a matching order row for this item
newOrderData.push(ordersByKey[itemKey]);
}
else {
// This is a new item, create a new order row with same key
var newRow = [itemKey];
// Pad out all columns for the new row
for (var col=1; col<orderData[0].length; col++) newRow.push('');
newOrderData.push(newRow);
}
}
// Update spreadsheet with reorganized order data
sheet2.getRange(2, keyCol, newOrderData.length, newOrderData[0].length).setValues(newOrderData);
}
我一直遇到的问题是,在运行脚本时,数据将被写入C列并导致IMPORTRANGE函数崩溃。理想情况下,我想将笔记放在导入范围数据之前的Test Data Script
的A列中,并使该列与Test Main Data
中的标题“ Name”同步。
答案 0 :(得分:0)
如果打开他对Synchronize independent spreadsheet rows, filled by IMPORTRANGE() 的回答中提供的Spreadsheet Mogsdad,您会看到他在其单元格“ A1”中粘贴了IMPORTRANGE
函数,该函数会导入更新的数据从工作表“项目”到工作表“订单”:
这是用新条目更新工作表所必需的。
您可以以相同的方式使用它,调整SpreadsheetId,工作表名称和范围,只是在您的情况下,应将公式复制到单元格C1中-假设您要为笔记保留A和B列。
您也可以将公式嵌入到您的Apps脚本代码中:
sheet2.getRange("C1").setValue("PASTE_YOUR_FORMULA_HERE");