Google sheets 生成像Q,R,S…AB这样的字符串,其中AB是googlesheet中的最后一列

Google sheets 生成像Q,R,S…AB这样的字符串,其中AB是googlesheet中的最后一列,google-sheets,Google Sheets,我有一个复杂的谷歌工作表查询,除了当谷歌工作表没有我在公式中使用的那么多列时,它工作得很好 下面是公式现在的样子: =sumfilterqueryINDIRECT'&A2&'$A$7:$23,选择Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH,其中B='&C2&',0,QueryDirect'&A2&'$A$7:$23,选择Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH,其中B='PROJECT',0>=date20

我有一个复杂的谷歌工作表查询,除了当谷歌工作表没有我在公式中使用的那么多列时,它工作得很好

下面是公式现在的样子:


=sumfilterqueryINDIRECT'&A2&'$A$7:$23,选择Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH,其中B='&C2&',0,QueryDirect'&A2&'$A$7:$23,选择Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH,其中B='PROJECT',0>=date2017,1,1,QueryDirect'&A2&'$A$7:$23,选择Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH,其中B='PROJECT',0这可以通过脚本完成。如果没有看到您的电子表格,很难确切地知道您需要什么,但这应该很接近。我从Sheet1中获取变量,并将公式返回到Sheet1。调整图纸名称以满足您的需要。这将根据变量表名查看数据表,确定最后一列。确定列字母并生成查询所需的字符串。然后设置新的查询公式。我添加了一个菜单来运行它

function onOpen() {
 SpreadsheetApp.getActiveSpreadsheet().addMenu(
    'Create Data', [ 
      { name: 'Run', functionName: 'formula' },
      ]);  
}
function formula(){
  var ss= SpreadsheetApp.getActiveSpreadsheet()
  var s=ss.getSheetByName("Sheet1") //sheet where variables are
  var sheet=s.getRange("A2").getValue()//variable sheet name
  var sel=makeString(sheet) //get the select string of column letters
  //Create formula and return to Sheet1 A3
  var f= s.getRange("A3").setFormula('=sum(filter(query(INDIRECT("\'" & A2 & "\'!$A$7:$23"),"select '+sel+' where B=\'"&C2&"\'",0),query(INDIRECT("\'" & A2 & "\'!$A$7:$23"),"select '+sel+' where B=\'PROJECT\'",0) >=date(2017,1,1),query(INDIRECT("\'" & A2 & "\'!$A$7:$23"),"select '+sel+' where B=\'PROJECT\'",0) <=date(2017,12,31)))')
   }
function makeString(sht){
  var ss= SpreadsheetApp.getActiveSpreadsheet()
  var s=ss.getSheetByName(sht)
  var lc=s.getLastColumn()
  var rng=s.getRange(1, 17, 1, lc).getValues()
  var str=''
  var ltr=[]
    for(var i=17;i<rng[0].length+1;i++){
   ltr[i]= columnToLetter(i)
    str=ltr.join(',')
  }
  var str1=str.substr(17)
  return str1
}
function columnToLetter(column)
{
  var temp, letter = '';
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

如果您有任何问题,请告诉我。

这可以通过内置功能完成:

在助手表上,假设您命名它,helper,用字母a到Z填充范围,比如A1:A26 假设在B1上写下以下公式: =数组公式{A1:A26;TRANSPOSESPLITJOIN,,SubstituteEqualyTransposeA1:A26&A1:A26,,27,,,,}。这将创建列字母标题的列表。 在每个新工作表上,使用columns1:1获得总列数。 要获取列标题的字符串,可以使用以下内容:

加入,离开服务器!B1,16,0,第1:1-16列 QUERYhelper!B:B,选择B限制和列1:1-7和偏移7 注:

如果您决定只使用一个帮助表并在多个电子表格上使用它,那么使用


QueryImportRange您的url,助手!B:B,根据上述注释选择列1限制和列1:1-7和偏移量7,最终公式为:

左Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH、AI、AJ、AK、A‌​五十、 上午、下午、下午、下午、下午、下午、下午,‌​AS,AT,AU,AV,AW,AX,AY‌​,AZ,BA,BB,BC,2*列直接A2&!1:1-33+IFColumnsINDIRECTA2&‌​!1:1>26,柱状‌​NDIRECTA2&!1:1-‌​26,0


其中A列包含Google工作表中的工作表选项卡列表。把这个放进B2,然后把它抄下来。我没有将此标记为正确答案,因为其他人给出了基于公式的正确答案,但这为我做到了。

谢谢大家。它非常有用,我可以在另一个项目中使用它。对于这一点,我只是尝试用公式。谢谢,鲁本。我试图避免在侧面或辅助表上添加数据。我以前意识到我可以构建一个两列的表,在这里我可以得到ColumnsINDIRECTA2的列数&!1:1其中A2有工作表名称值,然后在表上进行查找,其中第一列是列,第二列是字符串,如Q、Q、R、R、S等。最后,我将使用一个解决方案,使用LEFT获得我需要的这一长字符串的部分:Q、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH、AI、AJ、AK、AL、am、AN、AO、AP、AQ、AR、AS、AT、AU、AV、AW,AX,AY,AZ,BA,BB,BC。一旦我知道了一张表中的列,我就可以得到那张表的正确字符串,我只需要假设没有一张表会超过BC,我非常确定。但我很感激你的解决方案,从中我学到了很多。谢谢你。由于您按照要求使用公式进行了求解,我将您的公式标记为一个解决方案并结束此问题。我怀疑其他人是否需要此解决方案,但以下是通过左命令获取的字符数公式:IFB2>26,3*B2-59,2*B2-33,其中B列值包含列sindirecta2的结果&!给出任何给定工作表中列数的1:1公式。因此第2行的最终公式是LEFTQ、R、S、T、U、V、W、X、Y、Z、AA、AB、AC、AD、AE、AF、AG、AH、AI、AJ、AK、AL、AM、AN、AO、AP、AQ、AR、AS、AT、AU、AV、AW、AX、AY、AZ、BA、BB、BC、2*列!1:1-33+IFColumnsINDIRECTA2&!1:1>26,列直接2&!1:1-26,0@user1883779请考虑将您的解决方案作为回应。