如何将数组写出到电子表格。 setValues抛出“无法将数组转换为对象”

时间:2019-06-17 17:21:17

标签: javascript multidimensional-array google-apps-script google-sheets

我正在尝试将数组写到电子表格中,但是做错了。我读过许多帖子,说可以做我正在做的事情,但是不起作用。请参阅下面的最后一行代码

最后一行代码
'''consol_sheet.getRange(2,1,x,10).setValues(final_values);''' 我收到我的错误

  

“无法将数组转换为对象”

function iterateSheets() 
{
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('filesSheet');
  sh.clear();
  var folder=DriveApp.getFolderById('1axTLHOBPhl5_u7ngFOxViHg14OSw7pVC');//replace id with actual id of folder
  var files=folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  var consol_sheet = SpreadsheetApp.openById('18JnkQYa1L-FhXFmKJBrqJ6GI7BBO-V8QAVKP8PLLoXo').getActiveSheet();
  var x=2;
  var z=0;
  var final_values = new Array(50000);

while(files.hasNext())
 {
   var file=files.next();
    var ts=SpreadsheetApp.openById(file.getId());
    var allShts=ts.getSheets();

       for(var i=0;i<3;i++)   //allShts.length   
       {  
            var consol_values = allShts[i].getRange(8,1,40,26).getValues();  //.getRange(8, 1, 1, 1).getValues();
            var headers = allShts[i].getRange(7,6,1,20).getValues();  //.getRange(8, 1, 1, 1).getValues();
            var position= allShts[i].getRange("B1").getValue();
            var period = allShts[i].getRange("B2").getValue();
            var email = allShts[i].getRange("B3").getValue();    

         for (var z = 0;z<20;z++)//
         {   

           for (var y= 0;y<40;y++)              
           {          
               if (consol_values[y][i] != "")
               {
              /*  consol_sheet.getRange(x,1).setValue(consol_values[y][0]);  //AI pack 
                consol_sheet.getRange(x,3).setValue(consol_values[y][1]); //measure
                consol_sheet.getRange(x,4).setValue(email);
                consol_sheet.getRange(x,5).setValue(position);     


                final_values[x] = [];
                final_values[x][0]  =consol_values[y][0];  //AI pack 
                 //blank
                final_values[x][2]  =(consol_values[y][1]); //measure
                final_values[x][3]  =(email);
                final_values[x][4]  =(position);     
                final_values[x][5]  =(headers[0][z]);//location
                final_values[x][6]  =1;
                final_values[x][7]  =(period);
                final_values[x][8]  =(consol_values[y][3]); //price
                final_values[x][9]  =(consol_values[y][z+5]); //fcst

                if (consol_values[y][z+5] != "")
                { 
                    final_values[x][10] =(consol_values[y][25]); //fcst value             
                }                          


                x = Number(x)+1  //row count for consolidation output

              }
          }          
         }    
      }
    }


consol_sheet.getRange(2,1,x,10).setValues(final_values);

 }

这个论坛对帮助我达到这一点非常有帮助,现在我在这里还有一个障碍可以完成这个项目。

3 个答案:

答案 0 :(得分:3)

get()的参数应该是一个数组数组(二维数组),其中所有内部数组都具有相同数量的元素,并且这些元素应该是字符串,数字或Date对象,不能为空元素。

注意:

如果您的数组看起来像这样

setValues

将缺少的内部数组和[ [1,,'orange'], // 2nd element of this inner array is empty , // 2nd element of the outer array is empty [] // This array is empty ] 添加到内部数组的每个“空点”上。结果数组应如下所示:

''

(在每个空元素位置添加一个空字符串[ [1,'','orange'], ['','',''], ['','',''] ] )。

相关

答案 1 :(得分:0)

将行和列写入电子表格

这是一个简单的函数,可以将行和列写到电子表格中。

import React from 'react';
import './ImgSlider.scss';
import PropTypes from "prop-types";
import Img1 from "../../../assets/img/ImgSlider/adult-blur-church-1309052.png"
import Img2 from "../../../assets/img/ImgSlider/adult-cellphone-cheerful-1530313.png"
import Img3 from "../../../assets/img/ImgSlider/adult-commerce-cook-375889.png"
import Img4 from "../../../assets/img/ImgSlider/aisle-arches-architecture-2090830.png"
import PrArrow from "../../../assets/img/ImgSlider/Rectangle 3.153 (1).png"
import NtArrow from "../../../assets/img/ImgSlider/Rectangle 3.153.png"

class ImgSlider extends React.Component {
  constructor(props) {
    super(props)

    this.state = {
      images: [
        `${Img1}`,
        `${Img2}`,
        `${Img3}`,
        `${Img4}`        
      ],
      currentIndex: 0,
      translateValue: 0
    }
  }

  goToPrevSlide = () => {
    if(this.state.currentIndex === 0)
    return;
    this.setState(prevState => ({
      currentIndex: prevState.currentIndex -1,
      translateValue: prevState.translateValue + this.slideWidth()
    }))
  }

  goToNextSlide = () => {
    if(this.state.currentIndex === this.state.images.length -1) {
      return this.setState({
        currentIndex:0,
        translateValue: 0
      })
    }

    this.setState(prevState => ({
      currentIndex: prevState.currentIndex +1,
      translateValue: prevState.translateValue + - (this.slideWidth())
    }));
  }

  slideWidth = () => {
    return document.querySelector('.slide').clientWidth
  };

  render() {
    return(
      <div className="ImgSlider_Container">      

        <div className="ImgSlider_Container_Wrapper"
        style={{
          transform: `translateX(${this.state.translateValue}px)`,
          transition: 'transform ease-out 0.45s'
        }}>
          {
            this.state.images.map((image, imageIndex) => (
              <Slide key={imageIndex} image={image}/>
            ))
          }
        </div>

        <LeftArrow
        goToPrevSlide={this.goToPrevSlide} 
        />

        <RightArrow
        goToNextSlide={this.goToNextSlide}
        />

      </div>

    );
  }
}

const Slide = ({ image }) => {
  const styles = {
    backgroundImage: `url(${image})`,
    backgroundSize: 'cover',
    backgroundRepeat: 'no-repeat',
    backgroundPosition: '50% 60%'
  }
  return <div className="slide" style={styles}></div>
}

const LeftArrow =(props) => {
  return (
    <div className="backArrow arrow" onClick={props.goToPrevSlide}>

      <img className="la-icon" src={PrArrow} />

    </div>
  );
}

const RightArrow = (props) => {
  return (
    <div className="nextArrow arrow" onClick={props.goToNextSlide}>
      <img className="ra-icon" src={NtArrow} />
    </div>
  );
}

export default ImgSlider;

答案 2 :(得分:0)

您是否考虑过对您提取的原始2d数组consol_values进行修改?这样,您将知道您拥有期望数量的相同元素。您可以在0/1之外的其他地方开始循环,具体取决于您要忽略原始文件中的哪些值(在这种情况下,您的提取区域与您的写入区域并不完全相同)。