You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets脚本:映射数组中按序插入新行的实现咨询

实现周表新用户按字母顺序插入主表的Google Script方案

核心思路

  1. 提取主表已有的姓名列表,快速识别周表中的新用户
  2. 筛选周表中未在主表出现的用户,整理成符合主表格式的行数据
  3. 合并更新后的主表数据与新用户数据,按姓名字母顺序排序
  4. 清空主表原有数据后,写入排序后的完整数组

修改后的完整代码

function updateRinger() {
  const WEEKLYPOINTER = 1;
  const app = SpreadsheetApp;
  const ss = app.getActiveSpreadsheet();
  const best = ss.getSheetByName("Ringer");
  const nameSheet = ss.getSheetByName("Info");
  const sheetNameFromUser = nameSheet.getRange("A1").getValue();
  const latest = ss.getSheetByName(sheetNameFromUser);
  
  // 获取主表(Ringer)数据(从第2行开始,保留原逻辑排除最后一列)
  const ringer = best.getRange(2, 1, best.getLastRow(), best.getLastColumn() - 1).getValues();
  // 获取周表数据
  const weekly = latest.getRange(1, 1, latest.getLastRow(), latest.getLastColumn()).getValues();

  // 提取主表已有的姓名(转小写去空格,避免大小写/空格导致的匹配错误)
  const existingNames = ringer.map(player => player[0].trim().toLowerCase());

  // 处理已有用户的分数更新
  const updatedPlayers = ringer.map(updateScores);

  // 筛选周表中的新用户
  const newPlayers = [];
  for (let i = WEEKLYPOINTER; i < weekly.length; i++) {
    const weeklyName = weekly[i][0].trim().toLowerCase();
    if (!existingNames.includes(weeklyName)) {
      // 确保新用户数据符合主表19列(姓名+18洞)的格式
      const newPlayer = [...weekly[i]];
      while (newPlayer.length < 19) {
        newPlayer.push("");
      }
      newPlayers.push(newPlayer.slice(0, 19));
    }
  }

  // 合并已有更新用户和新用户,按姓名字母排序(不区分大小写)
  const combinedArray = [...updatedPlayers, ...newPlayers];
  combinedArray.sort((a, b) => {
    const nameA = a[0].trim().toLowerCase();
    const nameB = b[0].trim().toLowerCase();
    if (nameA < nameB) return -1;
    if (nameA > nameB) return 1;
    return 0;
  });

  // 清空主表原有数据(从第2行开始),写入合并排序后的数组
  best.getRange(2, 1, best.getLastRow() - 1, best.getLastColumn() - 1).clearContent();
  best.getRange(2, 1, combinedArray.length, combinedArray[0].length).setValues(combinedArray);

  // 分数更新逻辑函数
  function updateScores(player) {
    for (let i = WEEKLYPOINTER; i < weekly.length; i++) {
      if (weekly[i][0].trim().toLowerCase() === player[0].trim().toLowerCase()) {
        // 遍历18个洞,更新更低的分数或空值
        for (let j = 1; j < 19; j++) {
          if ((player[j] > weekly[i][j]) || (player[j] === "")) {
            Logger.log(`Update Needed: ${player[0]} Hole: ${j} Old Score: ${player[j]} New Score: ${weekly[i][j]}`);
            player[j] = weekly[i][j];
          }
        }
        return player;
      }
    }
    return player;
  }
}

关键修改点说明

  • 姓名匹配优化:所有姓名转小写并去除首尾空格,避免因大小写或空格差异导致的匹配失败
  • 新用户筛选:遍历周表对比主表姓名列表,提取新用户并确保数据格式与主表一致
  • 数组排序:合并后使用sort方法按姓名字母排序,保证主表始终有序
  • 写入逻辑调整:先清空原有数据再写入新数组,适配行数变化的情况

内容的提问来源于stack exchange,提问作者FeDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:17:47