【问题标题】:Google Script for getting Some Values, and Some formulas用于获取一些值和一些公式的谷歌脚本
【发布时间】:2015-02-12 22:14:03
【问题描述】:

我正在处理一张将数据从一张表传输到另一张表的工作表。我操纵了另一个我发现的脚本,它运行得很好。直到我需要将一些单元格作为值和一些作为公式。

我需要 Col A-Col D 作为“getValues” 我需要 Col E-Col Q 作为“getFormulas”

这是有效的公式:

function Copy(){
  var origSheetObject = SpreadsheetApp.openById('Key1').getSheetByName('Daily Log');
  var destSheetObject = SpreadsheetApp.openById('Key2').getSheetByName('Imported Data');
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange (6, 1, 1, 17).getFormulas();       
  var destlastRow = destSheetObject.getLastRow()+1;
  var cont;
  for (cont = 0; cont <origLastCol; cont++)
    destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);

我知道如果我将 getFormula 更改为 getValue,我只会得到值,而不是我需要查看的公式。这是我尝试过的,但它不正确:

function Copy(){
  var origSheetObject = SpreadsheetApp.openById('Key1').getSheetByName('Daily Log');
  var destSheetObject = SpreadsheetApp.openById('Key2').getSheetByName('Imported Data');
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange (6, 1, 1, 4).getValues();
                    origSheetObject.getRange (6, 5, 1, 13).getFormulas();       
  var destlastRow = destSheetObject.getLastRow()+1;
  var cont;
  for (cont = 0; cont <origLastCol; cont++)
    destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);

我不知道如何让它让我在同一行中提取值和公式。任何建议都会很棒!

【问题讨论】:

  • 你应该以这种方式将它分配给一个变量: var arrOrigData = origSheetObject.getRange (6, 1, 1, 4).getValues(); var arrorigformula = origSheetObject.getRange (6, 5, 1, 13).getFormulas();
  • 我了解以这种方式分配该变量的过程,但是我如何调用它将它们在 destSheetObject 中组合为一行

标签: google-apps-script google-sheets google-spreadsheet-api


【解决方案1】:
function Copy(){
   var origSheetObject = SpreadsheetApp.openById('Key1').getSheetByName('Daily Log');
   var destSheetObject = SpreadsheetApp.openById('Key2').getSheetByName('Imported Data');
   var origLastCol = origSheetObject.getLastColumn();
   var arrOrigData = origSheetObject.getRange(1, 1, 1, 17).getValues();
   var arrOrigForm = origSheetObject.getRange(1, 1, 1, 17).getFormulas();

   for( lin in arrOrigForm )
     for( col in arrOrigForm[ i ] )
       if( arrOrigForm[ lin ][ col ] != "" )
         arrOrigData [ lin ][ col ] = arrOrigForm[ lin ][ col ];      

   var destlastRow = destSheetObject.getLastRow()+1;
   var cont;
     for (cont = 0; cont <origLastCol; cont++)
         destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
 }

所以这就是我根据您的信息提出的 goether。我很愿意意识到我做的不对。如果您可以编辑此代码并向我展示它看起来应该如何完成,我应该能够解决我的错误并了解我现在无法做的事情。再次感谢您帮助我解决这个问题。

【讨论】:

  • 您可以更新初始问题或评论新代码,但将新问题作为答案并不实用,您可以将其删除。
【解决方案2】:

获取不同变量中的值和公式,然后遍历公式变量,如果有公式,则将该公式保存到原始变量中,如下:

var arrOrigData = origSheetObject.getRange(1, 1, 1, 17).getValues();
var arrOrigForm = origSheetObject.getRange(1, 1, 1, 17).getFormulas();

for( lin in arrOrigForm )
  for( col in arrOrigForm[ lin ] )
    if( arrOrigForm[ lin ][ col ] != "" )
      arrOrigData [ lin ][ col ] = arrOrigForm[ lin ][ col ];

你可以把这个保存到一个新的函数中,因为这个

function getValuesAndFormulas( A1Range ){
  var arrOrigData = origSheetObject.getRange( A1Range ).getValues();
  var arrOrigForm = origSheetObject.getRange( A1Range ).getFormulas();

  for( lin in arrOrigForm )
    for( col in arrOrigForm[ lin ] )
      if( arrOrigForm[ lin ][ col ] != "" )
        arrOrigData [ lin ][ col ] = arrOrigForm[ lin ][ col ];

  return arrOrigData;
}

使其成为 oneLiner 的唯一方法。

【讨论】:

  • Kriggs,非常感谢您帮助我。这种类型的东西不在我的范围内。我只是编码新手,尝试实施这种改变让我发疯!我尝试添加您的第一组建议代码,但出现错误“ReferenceError:“i”未定义。”你能帮我了解我需要在那个区域放置什么吗?根据您的反馈,我已将我不想使用的代码作为单独的答案包含在内。
  • 在第二个for 中漏掉了一个i,应该是arrOrigForm[ lin ]
猜你喜欢
  • 2022-01-18
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多