使用IMPORTRANGE同步独立工作表时出错

时间:2019-07-12 20:56:49

标签: google-apps-script google-sheets importrange

我有两张纸;一个是由许多人编辑的母版纸,另一个是使用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”同步。

1 个答案:

答案 0 :(得分:0)

如果打开他对Synchronize independent spreadsheet rows, filled by IMPORTRANGE() 的回答中提供的Spreadsheet Mogsdad,您会看到他在其单元格“ A1”中粘贴了IMPORTRANGE函数,该函数会导入更新的数据从工作表“项目”到工作表“订单”:

enter image description here

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

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

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

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