【问题标题】:Find Google Sheets that matches a value in a cell of a sheet and execute a piece of code查找与工作表单元格中的值匹配的 Google 表格并执行一段代码
【发布时间】:2021-05-05 18:28:51
【问题描述】:

对于这个看似藏身处的问题,我很抱歉,但我不得不问。对我如此赤裸裸。

我正在使用谷歌应用脚​​本并试图实现以下目标。我有两本 Google 电子表格书籍。

1.) 书 A 只有一张。
2.) 书 B 有 10 张。



1.) 在书 A 的工作表中,A 列包含文本值范围。例如:ALBWA、AUSCE、AUSLN、BFLCB
2. 在 B 册中,有多个按照 A 册表中的值命名的表。 例如:书 B,表 1 名称 = ALBWA,表 2 名称 = AUSCE 等... 3.在同一个单元格(“G3”)的所有这些表格中都有一个值。

我想要实现的目标是:使用脚本获取 A 书工作表的所有文本值并在 B 书中搜索工作表。如果找到工作表,则获取“G3”值并将其设置在列中B 的书 A 前面的匹配文本。如果工作表“ALBWA”“G23”有一个名为“ABC”的文本,则应将其粘贴到 B 列中的 Book A 工作表,如 A1 = ALBWA 和 B1 应为“ABC”。这需要重复,直到覆盖所有分页。

我知道我需要使用 for 循环,并且我正在尽力而为。我设法让它工作,但它只获得最后一个值并且只返回最后一张表和值。代码如下。

function testSplit(){

var gSheet            = SpreadsheetApp.openById("1q0tZMrvCvrH4dsQ0zx8GqI8mqZUsLcEGKu3IHfVrJ2M");
var sheet             = gSheet.getSheetByName("RS_Tharalsdson");
  
  var range_input     = sheet.getRange("G2:G").getValues();
  var filtered_input  = range_input.filter(String); //Eliminating all the empty values
  
  var ss          =SpreadsheetApp.getActive();
  var shA         =ss.getSheets();
  
    for(i=1;i<=filtered_input.length;i++){
            for(var j=1;j<shA.length;j++){
              var txt         = sheet.getRange(1+i,7).getValue(); //Get the values of each cell individually
              var sheetName = shA[j].getName();                
                  if(txt==sheetName){
                    console.log(sheetName)
                    var sheet_1     = ss.getSheetByName(sheetName);
                    var cell        = sheet_1.getRange(3,7);
                    var allVals     = cell.getValues();
                    var strVal      =  allVals.toString();
              
  
                    //Only get the Time from the text in Tharaldson Group
  
                    var array1  = [{}];
                    var string1 = strVal;
                    array1      = string1.split(":");      
                    var ddLine  = array1[3]+":"+array1[4];
                    
                    //Pasting the deadline to the relevant cell of the target sheet

                    sheet.getRange(1+i,9).setValue(ddLine);
                    console.log("Success");
   }
  }
 }
}

如果有好心人能帮我解决这个问题,我将不胜感激。非常感谢您。

【问题讨论】:

    标签: javascript google-apps-script google-sheets google-sheets-formula google-sheets-api


    【解决方案1】:

    以下脚本完成以下工作:

    1. 从您在 A 册中指定的范围内收集工作表名称
    2. 在 B 册中查找收集到的每张纸
    3. 获取您为书 B 中每张纸指定的范围内的值
    4. 将 3 中的值粘贴到您在 A 册中指定的粘贴范围中

    工作示例: Book A Book B

    const bookAId = '1wq1FCct3nB8oiVebYf__4NqAC0wtDSA_sBDPaPG67Ek'; // ssId of book A
    const bookBId = '1tx6k1TZU4h3ZrUZLFvoh3CvggFpvbLYNhiaWS0_rvmA'; // ssId of book B
    const sheetA = 'Sheet1' // name of sheet in book A containing sheet names
    const valueRange = 'G1'; // the cell in book B sheet i that you want to copy
    
    function testSplit() {
      const ssA = SpreadsheetApp.openById(bookAId);
      const sA = ssA.getSheetByName(sheetA);
      const sheetNames = sA.getRange('A2:A').getValues().reduce((names, row) =>  row[0] !== '' ? names.concat(row[0]) : names ,[]);
      const ssB = SpreadsheetApp.openById(bookBId);
      const valuesFromSheetB = []; // collect the values you find in each sheet of book B
      for (const sheetName of sheetNames) {
        const sheet = ssB.getSheetByName(sheetName);
        if (!sheet) {
          valuesFromSheetB.push(['Sheet Not Found']);
          continue;
        }
        const value = sheet.getRange(valueRange).getValue(); // get the value from the range you specified
        valuesFromSheetB.push([value]);
      }
      sA.getRange(2, 2, valuesFromSheetB.length, 1).setValues(valuesFromSheetB); // paste all of the values you collected into the paste range you specified in book A
    }
    
    

    请注意,此脚本与您的脚本之间的一个关键区别是,我在将 B 书中的工作表中的所有需要​​的值粘贴到粘贴范围之前收集它们,正如 Google 建议的那样,以最小化对电子表格服务的高成本调用。

    【讨论】:

    • 非常感谢您的快速回复。您的代码帮助很大。但现在我有另一个问题。根据此代码,“rangeContainingSheetNames”长度和“pasteRange”是硬编码的。我希望它是动态的。就像我在“A12”中添加另一个工作表名称并且bookB有或没有那个页面“A12”应该得到相关结果时会发生什么。我想不出一种动态设置pasteRange长度的方法。请帮助.
    • 嗨@HasinthakaTharindu 我发布了一个编辑以使工作表名称范围和粘贴范围动态
    • 非常感谢。你的代码就像一个魅力。我很感激,希望您能继续帮助社区中的每个人。
    • 你能看看这个并指出我做错了什么吗? stackoverflow.com/questions/66161255/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2018-12-16
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多