首页 > 解决方案 > 使用 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

标签: google-apps-scriptgoogle-sheetsimportrange

解决方案


如果您打开由 IMPORTRANGE() 填充的同步独立电子表格行的答案中提供的电子表格 Mogsdad ,您将看到他在他的单元格“A1”中粘贴了一个IMPORTRANGE函数,该函数将更新的数据从工作表“项目”导入工作表“订单”:

在此处输入图像描述

这是用新条目更新工作表所必需的。

您可以以相同的方式使用它,调整 SpreadsheetId、工作表名称和范围,只是在您的情况下,公式应该复制到单元格 C1 中 - 假设您想为笔记保留 A 列和 B 列。

您也可以将公式嵌入到您的 Apps 脚本代码中:

sheet2.getRange("C1").setValue("PASTE_YOUR_FORMULA_HERE");

推荐阅读