Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script GoogleSheets脚本:获取命名范围内每个单元格的符号_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script GoogleSheets脚本:获取命名范围内每个单元格的符号

Google apps script GoogleSheets脚本:获取命名范围内每个单元格的符号,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在研究的功能是优化美国杯AC75游艇上舵箔(stabilator)所需的力,以平衡帆力的纵向力矩。这是通过改变稳定器的角度来实现的,从最初提供一个向上(正)的力,然后随着帆力的增加,稳定器必须产生一个向下(负)的力 稳定角在一列中,当它改变时,如果它平衡了帆的力,其他的计算也会计算出来。如果没有,则会有一个“Delta”列,通过其角度指示舵箔是否需要提供更多/更少的力 我尝试对角度列使用命名范围,对Delta使用另一个命名范围。代码应该通过向stabilator添加多一点(或少一点)的角度来

我正在研究的功能是优化美国杯AC75游艇上舵箔(stabilator)所需的力,以平衡帆力的纵向力矩。这是通过改变稳定器的角度来实现的,从最初提供一个向上(正)的力,然后随着帆力的增加,稳定器必须产生一个向下(负)的力

稳定角在一列中,当它改变时,如果它平衡了帆的力,其他的计算也会计算出来。如果没有,则会有一个“Delta”列,通过其角度指示舵箔是否需要提供更多/更少的力

我尝试对角度列使用命名范围,对Delta使用另一个命名范围。代码应该通过向stabilator添加多一点(或少一点)的角度来迭代,并且每次都检查增量。我的代码错了

我需要做的是得到一个角度单元格的角度值,递增/递减,然后设置该单元格的值。下一步是获取对应的Delta单元格的值,以查看我是否为零(正/负少量)。如果没有,通过while循环,我再次增加/减少角度,设置值,重新检查增量,等等

我的问题是,我不知道如何在迭代时获取命名范围中每个单元格的符号,以便一次只为单个单元格重复获取value和setValue

function c_Optimise_Stabilator() {
// Author: Max Hugen
// Date: 20102-12-07
// Purpose: Attempt to optimise Stab Angle to balance with Stab Target Force

/* WARNING: This function may eventually cause a circular reference, so ensure there is an "escape".
 *          May occur if other optimisation functions are also run?
 * OPTIMISATION: Try in this order:
 *          1. Optimise Transverse Moments 
 *          2. Optimise Stabilator 
 *          3. Check, and if necessary, rerun Optimise Transverse Moments 
 *          4. Check, and if necessary, rerun Optimise Stabilator
 *             If Optimise Stabilator returns all Angles OK, we're good!
*/

  const ui = SpreadsheetApp.getUi();
  const ss = SpreadsheetApp.getActiveSpreadsheet();

//  var target_sheet = "Analysis";
//  var sheet = ss.getSheetByName("Analysis");
  var msg = ""; // gather input for Logger
  var s = "";   // short info for testing alerts, then added to msg
  var log = true; // whether to output msg to the Logger

  // angle range
  const maxAngle = 2.0, minAngle = -0.2, incAngle = 0.1;
  //limits
  var maxLoopIterations=10;  // to avoid excessive iterations
  var minDelta=0.02;          // to limit the minimum size of Delta tested
  // counters
  var i=0, loopIterations=0;
  // Original and New Vals
  var originalAngle=0.0, newAngle=0.0, originalDelta=0.0, newDelta=0.0;

  // ranges used in getRange - variable here, for testing. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/* 
  var sAngle = "Optimise_Stab_Angle";
  var sDelta = "Optimise_Stab_Delta";
 
  var sAngle = "Analysis!AF14:AG14";   // 1 rows (but only 2 cols now) - failing
  var sDelta = "Analysis!AM14:AM14";
*/  
  var sAngle = "Analysis!AF10:AG13";   // 4 rows
  var sDelta = "Analysis!AM10:AM13";

  var rAngle = ss.getRange(sAngle);
  var dAngle = rAngle.getValues();
  var rDelta = ss.getRange(sDelta);
  var dDelta = rDelta.getValues();
  
  originalAngle = Math.round(dAngle[i][1]*1000)/1000;
  originalDelta = Math.round(dDelta[i][0]*1000)/1000;

  var iLen = rAngle.getNumRows();

  for(i=0; i<iLen; i++){
    s = "";

    newAngle = originalAngle;
    s += "    Vb: " + dAngle[i][0] + "; Original Angle: " + originalAngle + "; originalDelta: " + originalDelta + "\r\n";

    // if stabilator force is below target (negative Delta), increase stab angle unless at maxAngle.
    if ( Math.abs(Math.round(dDelta[i][0]*100)/100) > minDelta && originalAngle < maxAngle) {

      loopIterations = 1; 
      while (newAngle <= maxAngle) {
        try {
          if ( newAngle == maxAngle ) {
            s += "                 MAX.ANGLE: newDelta" + newDelta + "; originalDelta: " + originalDelta;
            break;
          }
          // Have to update the Delta range, to check if Delta still too high/low
          var rDelta = ss.getRange(sDelta);
          var dDelta = rDelta.getValues();
          newDelta = Math.round(dDelta[i][0]*1000)/1000;
          
          if ( Math.abs(Math.round(newDelta*100)/100) < minDelta ) {
            s += "                 COMPLETED: newDelta" + newDelta + "; originalDelta: " + originalDelta;
            break;
          }
          if ( loopIterations > maxLoopIterations ) {
            s += "                 EXCEEDED maxLoopIterations of " + maxLoopIterations;
            break;
          }
        } catch(err) {
          Logger.log (c_ErrorToString (err) + "\n" + "Vb: " + dAngle[i][0]);
        }
        newAngle += incAngle;  // for some reason, this may STILL produce a number like 1.400000003 (example only)
        newAngle = Math.round(newAngle*1000)/1000;
        
        // set the new angle
        dAngle[i][1] = newAngle;
        // update the iteration count
        loopIterations ++
      } 
    }
    
    // if stabilator force is above target (positive Delta), decrease stab angle unless at minAngle.
    else if ( Math.abs(Math.round(dDelta[i][0]*100)/100) > minDelta && originalAngle > minAngle) {
      loopIterations = 1; 
      
      while (newAngle >= minAngle) {

        try {
          if ( newAngle == minAngle ) {
            s += "                 MIN.ANGLE: newDelta" + newDelta + "; originalDelta: " + originalDelta;
            break;
          }
          // Have to update the Delta range, to check if Delta still too high/low
          var rDelta = ss.getRange(sDelta);
          var dDelta = rDelta.getValues();
          newDelta = Math.round(dDelta[i][0]*1000)/1000;
          
          if ( Math.abs(Math.round(newDelta*100)/100) < minDelta ) {
            s += "                 COMPLETED: newDelta" + newDelta + "; originalDelta: " + originalDelta;
            break;
          }
          if ( loopIterations > maxLoopIterations ) {
            s += "                 EXCEEDED maxLoopIterations of " + maxLoopIterations;
            break;
          }
        } catch(err) {
          Logger.log (c_ErrorToString (err) + "\n" + "Vb: " + dAngle[i][0]);
        }

        newAngle -= incAngle;  // for some reason, this may STILL produce a number like 1.400000003 (example only)
        newAngle = Math.round(newAngle*1000)/1000;
        
        // set the new angle
        dAngle[i][1] = newAngle;
        // update the iteration count
        loopIterations ++
      } 
    }
    
    msg += s + "\r\n";
  }
  rAngle.setValues(dAngle);
  
  msg = "c_Optimise_Stabilator \r\n" + msg
  Logger.log(msg);
  ui.alert(msg);
}
功能c_优化_稳定器(){
//作者:马克斯·休根
//日期:20102-12-07
//目的:尝试优化刺入角度,以平衡刺入目标力
/*警告:此函数最终可能导致循环引用,因此请确保存在“转义”。
*如果同时运行其他优化功能,可能会发生什么情况?
*优化:按以下顺序尝试:
*1.优化横向力矩
*2.优化稳定器
*3.检查并在必要时重新运行以优化横向力矩
*4.检查并在必要时重新运行Optimize Stabilator
*如果Optimize Stabilator返回所有角度正常,则我们很好!
*/
const ui=SpreadsheetApp.getUi();
const ss=SpreadsheetApp.getActiveSpreadsheet();
//var目标\ u sheet=“分析”;
//var sheet=ss.getSheetByName(“分析”);
var msg=”“;//为记录器收集输入
var s=“”;//用于测试警报的简短信息,然后添加到消息中
var log=true;//是否向记录器输出消息
//角度范围
常数maxAngle=2.0,minAngle=-0.2,Cingle=0.1;
//极限
var maxLoopIterations=10;//避免过度迭代
var minDelta=0.02;//限制测试增量的最小大小
//计数器
变量i=0,循环迭代次数=0;
//原始和新VAL
var originalAngle=0.0,newAngle=0.0,originalDelta=0.0,newDelta=0.0;

//getRange-variable中使用的范围用于测试。找到了获取单元格A1Notation的方法,在范围上使用getCell(),然后使用getA1Notation

cellA1 = range.getCell(1, 1).getA1Notation();