google-apps-script - 使用 IMPORTRANGE 同步独立工作表时出错
问题描述
我有两张床单;一个是由许多人编辑的主表,另一个是使用 IMPORTRANGE 的主表副本,我的团队在 IMPORTRANGE 数据旁边的列中做笔记。这会遇到一个古老的问题,即当有人在主数据上删除或插入一行时,第二张表上的数据会变得不对齐。
我有一个名为Test Main Data的主表和一个名为Test Data Script的测试表。
参考由@sam询问的IMPORTRANGE () 填充的同步独立电子表格行,我使用@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 函数崩溃。理想情况下,我想将我的笔记放在 A 列中Test Data Script
,在导入范围数据之前,并让该列与 中的标题“名称”同步Test Main Data
。
解决方案
如果您打开由 IMPORTRANGE() 填充的同步独立电子表格行的答案中提供的电子表格 Mogsdad ,您将看到他在他的单元格“A1”中粘贴了一个IMPORTRANGE
函数,该函数将更新的数据从工作表“项目”导入工作表“订单”:
这是用新条目更新工作表所必需的。
您可以以相同的方式使用它,调整 SpreadsheetId、工作表名称和范围,只是在您的情况下,公式应该复制到单元格 C1 中 - 假设您想为笔记保留 A 列和 B 列。
您也可以将公式嵌入到您的 Apps 脚本代码中:
sheet2.getRange("C1").setValue("PASTE_YOUR_FORMULA_HERE");
推荐阅读
- unity3d - 在 Unity 中销毁游戏对象
- python - 向 ADT 添加新方法
- javascript - XMLHttpRequest 发送 (POST) 带有“+”的参数
- google-apps-script - 从库中导入引用的函数时,JSDoc 函数类型提示不同
- c# - 在 C# 中以功能样式编写策略模式的可能方法是什么?
- javascript - 使用 Javascript 切换 CSS - 禁用汉堡菜单后面的滚动
- javascript - 如何根据反应js中的选定值显示数据?
- spring-boot - 获取 MockMvc 和 @MockBean 字段的空指针
- python - graphql api没有将代码视为石墨烯中的字符串
- github - 使用 yarn 或 npm 安装包时出错,`Request failed \"401 Unauthorized`