【问题标题】:comparing multiple columns at once with App Scripts使用 App 脚本一次比较多列
【发布时间】:2025-11-25 11:05:02
【问题描述】:

我需要一些帮助来确定最有效的方法来比较一个工作表与另一个工作表的一行中的列组合。

我有两张表,它们都有四列:State、Area、City 和 Location。

PINPOINT 表 - 此表具有唯一的值组合

FEED 表 - 此表具有重复的值组合,以及来自 PINPOINT 表的 KEY 值。

我想要的是一段代码

"如果 FEED 表中 CL 列中的一行包含 PINPOINT 表中 K 列中的键值,

...但是 FEED 表行的 CN 到 CQ 列与 PINPOINT 表中的 A-D 列的值不同...

将 CN 列更新为 CQ FEED 表,其值组合与 PINPOINT 表中的 A-D 相同。"

我在下面粘贴了最新的代码以及图像。它给了我一个数组,说数组是“未定义的”。我刚开始学习代码,所以如果有人提出解决方案,我很乐意重写。

无论如何,任何关于我应该如何写这篇文章的见解都会非常有帮助。

var Data = SpreadsheetApp.getActiveSpreadsheet(); // DATA spreadsheet

  var PinpointDataSheet = Data.getSheetByName("The Pinpoints") // DATA "Pinpoint" sheet
  var PinpointAllValues = PinpointDataSheet.getRange(2, 1, PinpointDataSheet.getLastRow()-1,PinpointDataSheet.getLastColumn()).getValues();


  var FeedDataSheet = Data.getSheetByName("The Feed_Raw") // DATA "Feed" sheet
  var FeedAllValues = FeedDataSheet.getRange(2, 1, FeedDataSheet.getLastRow()-1,FeedDataSheet.getLastColumn()).getValues();

  var PinpointStateObj = {}; // Object for "Locale" values
  var PinpointAreaObj = {}; // Object for "Locale" values
  var PinpointCityObj = {}; // Object for "Locale" values
  var PinpointSpotObj = {}; // Object for "Locale" values

  for(var P = PinpointAllValues.length-1;P>=0;P--) // put Pinpoint values in array..

  {
    PinpointStateObj[PinpointAllValues[P][0]] = PinpointAllValues[P][10]; 
    PinpointAreaObj[PinpointAllValues[P][1]] = PinpointAllValues[P][10]; 
    PinpointCityObj[PinpointAllValues[P][2]] = PinpointAllValues[P][10];
    PinpointSpotObj[PinpointAllValues[P][3]] = PinpointAllValues[P][10]; 
  }

  for(var F = FeedAllValues.length-1;F>=0;F--) // for each row in the "Feed" sheet...
  { 
   var Feed_GeotagKey = FeedAllValues[F][90]; // Pinpoint Key values in Feed sheet
    {
      // If Pinpoint array dont match feed values
      if ((PinpointStateObj[Feed_GeotagKey] != FeedAllValues[F][95]) || (PinpointAreaObj[Feed_GeotagKey] != FeedAllValues[F][96]) 
        || (PinpointCityObj[Feed_GeotagKey] != FeedAllValues[F][97]) || (PinpointSpotObj[Feed_GeotagKey] != FeedAllValues[F][97]))
        {
        FeedAllValues[F][95] = PinpointAllValues[P][0]; // ...Change FYI Category Name in FYI Topic Sheet 
        FeedAllValues[F][96] = PinpointAllValues[P][1];
        FeedAllValues[F][97] = PinpointAllValues[P][2];
        FeedAllValues[F][98] = PinpointAllValues[P][3];

      }
    }
  }

Geotag Sheet - unique values "Dark column" Feed Sheet - recurring values - "Highlighted column"

【问题讨论】:

    标签: javascript arrays loops google-apps-script javascript-objects


    【解决方案1】:
    1. 您输入错误 - 请更改

    PinpointStateObj[PinpointtAllValues[P][0]] = PinpointAllValues[P][10];

    PinpointStateObj[PinpointAllValues[P][0]] = PinpointAllValues[P][10];

    1. 您的 if 语句包含 (PinpointHoodObj[Feed_GeotagKey] != FeedAllValues[F][97]),但您没有名为 inpointHoodObj 的数组 - 我假设您的意思是 PinpointCityObj

    2. 1234563 (您在 FEED 中将正确排序的值分配给您的范围,但作为一般建议:

    使用indexOf()。它是一种 Javascript 方法,可让您既找出键是否包含在数组中,又检索其在数组中的位置。

    示例:

    ...
    //check either PinpointStateObj[Feed_GeotagKey] is contained in row FeedAllValues[F]
    if(FeedAllValues[F].indexOf(PinpointStateObj[Feed_GeotagKey])!=-1){
    //if the key value is contained in the row - find its position (column)
      var columnNumber=FeedAllValues[F].indexOf(PinpointStateObj[Feed_GeotagKey])+1;
      //implement a comparison either the column where the key value is contained corresponds to the desired one
      ...
      }
    ...
    

    【讨论】:

    • 感谢您的建议。我试图重新格式化我的代码以使其更易于理解。我会做出这些改变并让你知道。我还在原始帖子中添加了我的电子表格的图像以帮助澄清我的问题。
    • 抱歉,回复延迟。我有点难以弄清楚,所以我朝着不同的方向前进。我在这里发了一篇关于它的帖子 [*.com/questions/59870660/…