2017-10-19 42 views
-1

该程序除了获取一行数据之外完美工作。它总是抓住一个空白集。任何人都能看到我失踪的东西?复制和粘贴一个愚蠢的行应该很简单。.getValues()无法正常工作,如果按公式创建的值Google Apps脚本

我需要从编辑的行中抓取D:BA中的数据。接下来,删除创建数据的公式,然后将保存的数据粘贴回行中,以便我可以对其进行自定义。

function onEdit(e) { 
    if(e.range.columnStart != 1 || 
    e.source.getActiveSheet().getName() != "Loads") 
    /*e.source.getActiveSheet().getName() != "Loads") || 
    e.range.rowStart != 9 || e.range.columnStart != 1 || 
    e.range.rowEnd != 53 || 
    e.range.columnEnd != 1*/ 
    ){ 
    return; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Loads"); 
    var arr = []; 
    var r = e.range.getRow(); 
    var cell1 = sheet.getRange(r,1); 
    var cell2 = sheet.getRange(r,2); 
    var lastColumn = sheet.getLastColumn(); 
    var row = sheet.getRange(r,4,49,49); 
    var value = e.value; 
    var arr = []; 

    // get cell 2 
    var cell2value = cell2.getValue(); 
    // delete cell 
    cell2.clear(); 
    //paste formula 
    cell2.setFormula('=split(REGEXREPLACE(A'+r+',\",\",\", \"),\",\",true)'); 

    // copy row r,3,1,40 
    //var row2 = sheet.getRange(r,4,1,10); 
    var rowValues = row.getValues(); 

    //push row values to array 
    arr.push(rowValues); 
    // clear e.range 
    cell1.clear(); 
    // delete cell 
    cell2.clear(); 
    // paste cell 
    //cell2.setValue(cell2value); 
    // paste row 
    row.setValues(arr); 
    } 
}; 
+0

第一印象:你确定它一直在运行吗?你的'if()'条件没有'else',所以如果它是真的,它会调用'return'并且什么也不给你,如果条件计算结果为false,没有什么可执行的。 –

回答

0

首先,你的逻辑永远不会被执行:若您if()条件评估为trueonEdit(e)执行return &没有什么事情发生,否则(当if()评估为false)没有其他代码来执行。你的意思可能是if(!foo){ return; },否则你需要添加一个else子句。此外,如果例如其他'Loads'的任何表单上的单元格A1被编辑,则您的if()条件将评估为true:我不确定这是您想要的。你可能想在这里使用逻辑与。

接下来,您只抓取'Loads'工作表中的数据:您从不参考编辑工作表中的行。您可能需要2个工作表物件:一个用于编辑的工作表,您可以通过ss.getActiveSheet() &获得第二个“装载”。

当您拨打sheet.getRange()时,您也正在抓取一个49x49的数组,这意味着您的range.getValues()调用也会返回一个49x49的数组值,这不是您的描述所要表达的内容。你的意思是sheet.getRange(r,4,1,49)? (返回1x49阵列。)

arr.push(rowValues)由推你的二维数组rowValues到一个新的数组元素arr[],使得arr[]三维阵列(arr[0]包含49x49阵列rowValues)复杂的问题。如果您需要将rowValues复制到另一个变量,只需指定它:var arr = rowValues;

您是否试图清除公式表格cell2?如果是这样,您需要设置一个空的公式,因为range.clear()会保留公式。

其他一切似乎工作正常,但我不知道你到底想做什么。我希望这有助于,寿。

+0

我想指出的问题不是缺少'else'子句。你可以使用'if()'而不使用'else'并且运行得很好,问题在于括号所在的位置。我的理解是他想要做一个'if(/ * reasons * /){return}'这是完全正常的,如果你想在条件满足的情况下终止函数的话。 – Vytautas

+0

谢谢,@Vytautas,你说得对。不知道为什么我没有从这个角度看待它:你对早期的“回报”问题有更好的解释。我已经更新了我的答案,以包含您的洞察力。 –

+0

谢谢你们,是的if条款似乎运作良好。 – Clayten